HackWare.ru
PowerShell — это платформа, инструмент автоматизации и настройки, который работает в различных операционных системах. PowerShell это больше чем просто скриптовый язык программирования, PowerShell содержит функции для управления локальным и удалённым компьютером. В зависимости от установленного ПО (в первую очередь административного и серверного программного обеспечения) количество функций (командлетов) PowerShell может быть различным.
Знание PowerShell необходимы системным администраторам Windows, а также аудиторам безопасности, поскольку имеется достаточно много отличных и уникальных инструментов, написанных на PowerShell (в первую очередь направленных на пентест Windows). Для продвинутых пользователей Windows знание PowerShell не будет лишним, т. к. с его помощью можно автоматизировать рутинные задачи и более тонко (или просто быстрее чем через графический интерфейс) настроить свою систему Windows.
PowerShell имеет богатые возможности, активно развивается, портирован на Linux, имеет огромную справку, которая также активно поддерживается и развивается. Эта статья посвящена не языку PowerShell, а настройке рабочего окружения для поддержки PowerShell и запуску скриптов — хотя PowerShell предустановлен в каждую Windows, свои особенности (трудности) есть даже там. Проще говоря, эта статья посвящена не тому, как написать свою первую программу «Hello, World!» на PowerShell, а тому, как запустить готовую программу «Hello, World!» в PowerShell.
Управление «один к одному»
Самый простой способ удаленного управления — интерактивно открыть удаленную сессию и в ней выполнить нужные действия. Например, откроем сессию на компьютер SRV4 и рестартуем на нем сервис печати:
Enter-PSSession -ComputerName SRV4
Restart-Service -Name spooler
Посмотрим состояние сервиса и закроем удаленную сессию:
Get-Service -Name spooler
Exit-PSSession
Интерактивная работа подходит для решения несложных задач удаленного администрирования. Если же надо автоматизировать процесс, то лучше воспользоваться командлетом Invoke-Command . Вот так с его помощью можно сделать то же самое действие:
Invoke-Command -ScriptBlock -ComputerName SRV4
Эта команда откроет удаленную сессию на SRV4, выполнит блок команд, указанный в параметре -ScriptBlock , и закроет сессию. А чтобы задание выполнялось в фоновом режиме, дополнительно можно указать параметр -AsJob .
Cледует помнить о том, что при работе в фоновом режиме PowerShell не возвращает результат. Для его получения придется воспользоваться командлетом Receive-Job .
Для того, чтобы выполнить не пару-тройку команд, а какой либо скрипт, у Invoke-Command есть параметр –FilePath , который можно использовать вместо –ScriptBlock для определения файла сценария. Для примера я создал скрипт, который выводит список остановленных служб и запустил его на удаленной машине SRV4:
Invoke-Command -FilePath .script.ps1 -ComputerName SRV4
Удаленное выполнение PowerShell с помощью Invoke-Command
Командлет Invoke-Command позволяет выполнить команду на одном или нескольких удаленных компьютерах.
Например, для запуска одиночной команды на удаленном компьютере можно использовать такую команду:
Invoke-Command -ComputerName dc01 -ScriptBlock
Эта команда выведет в вашу консоль значение версии PowerShell, установленной на удаленном компьютере, имя которого указано в параметре -ComputerName . В блоке -ScriptBlock указывается команда, которую нужно запусть на удаленном компьютере.
По-умолчанию команда, посланная через Invoke-Command выполняется на удалённом компьютере от текущего пользователя. Если нужно выполнить команду от имени другого пользователя, сначала нужно запросить учетные данные пользователя и сохранить их в переменную:
$cred = Get-Credential
Invoke-Command -ComputerName comp-buh2 -Credential $cred -ScriptBlock
Можно задать несколько команд в блоке ScriptBlock, их нужно разделить точкой с запятой. Например следующая команда выведет текущий часовой пояс и изменит его на другой:
Invoke-Command -Computername dc01 -ScriptBlock
Invoke-Command позволяет выполнять не только отдельные команды, но и запускать скрипты PowerShell. Для этого используется аргумент -FilePath (вместо –ScriptBlock). При этом вы указываете путь к локальному PS1 файлу скрипта на вашем компьютере (вам не нужно копировать файл скрипт на удаленный компьютер):
Invoke-Command -ComputerName Server01 -FilePath c:PSScriptsGetComputerInfo.ps1
Выполнение блока сценария (Scriptblock) на удаленном компьютере
Удаленное взаимодействие с помощью PowerShell позволяет выполнять на удаленном компьютере блок сценария, или scriptblock (то есть блок кода PowerShell, заключенный в фигурные скобки). Для этого нужно воспользоваться командой Invoke-Command с параметром -ComputerName. К примеру, в команде, отображенной на экране 1, я использовал команду Invoke-Command, с тем чтобы выполнить Get-ChildItem на удаленном компьютере. Просматривая экран 1, обратите внимание на то, что для установления соединения с удаленным компьютером перед тем, как запустить блок сценария, я не использовал команду Enter-PSSession. Команды Enter-PSSession и Invoke-Command — это два различных метода удаленного взаимодействия.
Экран 1. Выполнение блока сценария на удаленном компьютере |
Первым параметром команды Invoke-Command является параметр -ScriptBlock; он указывает на код, который вы собираетесь выполнить. На экране 1 я опустил имя параметра -ScriptBlock, поскольку указывать его необязательно. Параметр -ComputerName содержит имя удаленного компьютера. Как можно увидеть в выходных данных команды Get-ChildItem, среда PowerShell для удобства оператора даже указывает имя удаленного компьютера в столбце PSComputerName выходных данных.
Удаленное администрирование. Установка и удаление программ
Иногда удаленному выполнению команд может препятствовать антивирус или встроенный брандмауэр, в зависимости от настроек безопасности вашей сети. При необходимости отключаем их.
Отключить антивирус удаленно на примере KAV
psexec ComputerName «C:Program Files (x86)Kaspersky LabKaspersky Endpoint Security 10 for Windows SP2avp.com» exit / login = KLAdmin / password = < Pass >
Отключение встроенного брандмауэра для всех профилей (только локально)
Для удаленного отключения брандмауэра должен быть доступен Сервер RPC. Доступ к которому блокирует включенный брандмауэр Такая рекурсия.
Поэтому, как всегда, пойдем обходным путем:
Команда на включение брандмауэра, соответственно, будет state on
Удаление программы
Установка программы
Тихая установка с предварительным копированием программы на удаленный хост
Установка с сетевого ресурса
Административные шары, такие как «C$»,
для подобной команды не функционируют.
Необходимо создать сетевую папку вручную
Так же возможна установка по списку компьютеров используя «@», как показано в основной заметке по Psexec.
Получить список программ
Получать список установленных в системе программ лучше из реестра, нежели средствами WMI. Этот метод работает намного быстрее, чем при использовании
Get-WmiObject -Class Win32_Product
Get — ItemProperty HKLM : Software Microsoft Windows CurrentVersion Uninstall * | Select DisplayName | Sort DisplayName
Get — ItemProperty HKLM : SOFTWARE WOW6432Node Microsoft Windows CurrentVersion Uninstall * | Select DisplayName | Sort DisplayName
Из-за того что в системе могут быть установлены как 64, так и 32 битные приложения, необходимо получать значения обеих веток. Можно поместить весь список в одну переменную.
Так же читайте как в тихом режиме деинсталлировать любую программу по ее GUID
Планировщик заданий (Task Scheduler)
Планировщиком заданий можно управлять из командной строки используя две утилиты – at.exe и schtasks.exe. Обе эти утилиты позволяют указать имя удалённого компьютера для создания задания, и, следовательно, позволяют решить нашу задачу. Но подробно мы рассмотрим лишь schtasks.exe, так как она предоставляет гораздо больше возможностей.
Хотя выполнение команд на других компьютерах не является основным предназначением планировщика, тем не менее он позволяет реализовать немало интересных сценариев. Например, с его помощью можно включить установку программного обеспечения в период обеденного перерыва. Или если ваши пользователи обедают в разное время, запуск можно выполнять после определённого периода бездействия компьютера.
schtasks /create /s server6.td.local /tn install /tr \maindatainstall.cmd /sc once /st 13:00 /ru system
Важно понимать от имени какой учетной записи будет выполняться задача. В этом примере я указал для параметра /ru значение system, следовательно, для выполнения установки учетной записи компьютера будет необходим доступ на чтение в сетевую папку с дистрибутивом программы.
Еще полезным решением, мне кажется запланировать какое либо действие, на ежедневное выполнение, и удалять задачу лишь при подтверждении его успеха. То есть вы можете создать простой командный файл, который сначала запускает установщик программы, дожидается его завершения, и проверяет – успешно ли установилась программа. Если это так, то он удаляет задание из планировщика на этом компьютере. Пример такого файла:
Установка программного обеспечения при помощи OneGet
Вот и настало время самого процесса установки программных продуктов. Далее вы увидите, как можно установить поставщик пакетов, найти требуемое программное обеспечение, установить его, а также как можно удалить ненужное приложение и загрузить себе на компьютер инсталляционный пакет программного продукта. Начнем по порядку.
Установка поставщика пакетов Chocolatey
-
-
- Откройте оболочку Windows PowerShell и для отображения списка источников пакетов, которые зарегистрированы в OneGet на локальном компьютере выполните команду Get-PackageSource. Обратите внимание на то, что если в команде вы указываете конкретный поставщик пакета, то в таком случае командлет Get-PackageSource отобразит для вас только те источники, которые связаны с указанным вами поставщиком. В противном случае команда возвращает все источники пакетов, которые зарегистрированы в OneGet. Так как нам нужно просмотреть источники пакетов для всех провайдеров, команда будет выполняться без каких-либо дополнительных параметров. Обязательно обратите внимание на то, что на данном этапе у вас дополнительный поставщик пакетов, который будет использоваться для инсталляции программных продуктов еще не установлен. Выходные данные команды вы можете посмотреть на следующем изображении:
- Рис. 1. Команда Get-PackageSource.
- Как видно на предыдущей иллюстрации, поставщик Chocolatey не установлен на нашем локальном компьютере. Следовательно, это нужно исправить. Обратите внимание на то, что для добавления поставщика пакетов у параметра ExecutionPolicy оболочки PowerShell должно быть установлено значение Unrestricted. В противном случае добавить поставщик не получится. Напомню, что командлет Get-ExecutionPolicy позволяет вам отобразить политики выполнения для текущего сеанса. Политика выполнения – это часть стратегии безопасности оболочки Windows PowerShell, которая определяет, можно ли загружать файлы конфигурации и выполнять скрипты, а также определяет, для выполнения каких скриптов требуется цифровая подпись. По умолчанию используется значение «Restricted» (не загружает файлы конфигурации и не выполняет скрипты), поэтому если вы у себя не изменяли значение политики выполнения – выполните команду Set-Executionpolicy Unrestricted. Так как по умолчанию областью политики выполнения является значение LocalMachine, чтобы параметры политики распространялись только на текущего пользователя, вы можете к применяемой команде еще добавить параметр –Scope со значением CurrentUser. Выходные данные этих двух команд видно на следующей иллюстрации:
- Рис. 2. Изменение параметров политики выполнения.
- На этом этапе мы можем посмотреть список поставщиков, которые зарегистрированы в OneGet на текущем компьютере. Для этого вы можете воспользоваться командлетом Get-PackageProvider. Данный командлет, как я уже успел упомянуть немного выше, возвращает список поставщиков пакетов, которые уже подключены в OneGet. При желании вы можете отфильтровать результаты, основанные на всех или на части одного (нескольких) имени поставщика. Например, чтобы посмотреть, какие поставщики подключены на данный момент, вы должны выполнить командлет Get-PackageProvider без каких-либо дополнительных параметров. Как видно на следующей иллюстрации, изначально на компьютере у меня подключено 4 таких поставщика, о которых я уже сегодня вам рассказывал. Теперь, чтобы установить поставщик Chocolatey на компьютере вам нужно выполнить команду Get-PackageProvider –Name Chocolatey –ForceBootstrap, где параметр –ForceBootstrap отвечает за автоматическую установку поставщика. Обратите внимание на то, что, как правило, при установке поставщика Chocolatey также должен быть просинталлирован поставщик NuGet. Как видно на следующей иллюстрации, после повторного использования командлета Get-PackageProvider, устанавливаемый нами поставщик уже должен фигурировать в списке:
Теперь мы можем сгенерировать полный список всех доступных в поставщиках пакетов и передать его по конвейеру командлету Export-CliXML для создания XML-представления объектов и их сохранения в XML-файле. Учтите, что экспортируемый вами список будет постоянно меняются и со временем все больше и больше пакетов будут добавляться в используемые вами репозитории. Соответственно, не забывайте время от времени заменять экспортируемый вами файл. Для того чтобы выполнить экспорт списка пакетов и сохранить этот список в папке C:TestPosh вам нужно выполнить следующую команду: Find-Package | Export-CliXML C:TestPoshTest.xml
Учтите, что процедура экспорта обязательно займет у вас какое-то время. После того как команда закончит выполняться и у вас на компьютере будет создан XML файл, импортируйте его и, для удобства просмотра, при помощи конвейера и команды GridView, отвечающей за отображение результатов выполнения команды в окне в виде интерактивной таблицы, можете посмотреть, какие пакеты будут доступны для установки. Естественно, этот список пакетов вы можете открыть при помощи любого приложения, которое способно обрабатывать XML файлы, например, средствами того же Excel. Данная команда, как вы видите на следующей иллюстрации, выглядит следующим образом: Import-CliXML С:TestPoshTest.xml | Out-GridView
Рис. 4. Просмотр списка пакетов, доступных для установки.
Так как поставщик уже установлен, можно переходить к следующей части данной процедуры, а именно к
Установке программного обеспечения средствами PowerShell
Прежде чем устанавливать программные продукты нам следует посмотреть, что же уже установлено на компьютере. Для выполнения этой задачи вы можете воспользоваться командлетом Get-Package, который возвращает список всех пакетов программного обеспечения, установленных на локальном компьютере как с помощью OneGet, так и другими средствами инсталляции приложений. При желании вы также можете запускать командлет Get-Package и на удаленных компьютерах, запустив его как часть Invoke-Command, команды Enter-PSSession или скрипта.
В том случае, если вы хотите получить информацию по конкретному программному обеспечению, например, по установленным продуктам Microsoft Office 2013, вы можете наряду с данным командлетом использовать параметр –Name с соответствующим значением, например, Get-Package -Name «office 2013». Выходные данные этого командлета видны ниже:
Рис. 5. Вывод командлета Get-Package.
Перед инсталляцией программного обеспечения попробуем определиться с тем, что же нам нужно установить. Так как на машине установлен только офис 2013 и еще несколько приложений, далее я вам покажу, как можно установить такие программные продукты, как Adobe Creative Cloud, Adobe Reader, Notepad++, а также Process Explorer, Process Monitor и WinRar.
Ввиду того, что до самого процесса инсталляции нам нужно сами пакеты локализовать, следует воспользоваться возможностями командлета Find-Package. Как вы уже заметили немного ранее, данный командлет позволяет выполнять поиск инсталляционных пакетов в доступных на локальном компьютере источниках пакетов. В том случае, если вы не будете использовать с данным командлетом какие-либо параметры, вам будет выведен командой полный список всех приложений, как было заметно ранее.
Например, для начала попробуем найти приложения Adobe, которые доступны для инсталляции из добавленного нами поставщика Chocolatey. Для этого достаточно помимо самого командлета указать параметр –Name и в качестве его значения ввести искомый программный продукт. Так как после слова Adobe у инсталляционных пакетов может быть указано имя продукта, следует ввести имя продукта следующим образом: Adobe*, как показано на следующей иллюстрации. Как вы видите, модуль OneGet обнаружил в репозитории следующий инсталляционный пакет: adobe-creative-cloud версии 1.0. В принципе, это один из искомых продуктов, а это значит, что его следует проинсталлировать. Для этого, как также можно заметить на следующей иллюстрации, нужно воспользоваться возможностями командлета Install-Package. Чтобы установить Creative Cloud выполняется следующая команда Install-Package -Name adobe-creative-cloud –Force, где параметр Force, как принято в PowerShell, переопределяет ограничения, препятствующие выполнению команды до тех пор, пока изменения не начнут нарушать требования безопасности. Выходные данные этих команд можно увидеть на следующей иллюстрации:
Рис. 6. Установка Adobe Creative Studio
Теперь, после того как первый программный продукт был установлен попробуем выполнить поиск определенной версии Adobe Reader. Для этого помимо уже известной команды Find-Package –Name AdobeReader следует добавить параметр –AllVersions, который возвращает все доступные версии пакета, или все версии пакета, которые находятся в диапазоне, указанном в параметрах MinimumVersion и MaximumVersion. Обратите внимание на то, что этот параметр не является обязательным, так как изначально поиск отображает свежайшую версию программного продукта. Теперь из всех доступных версий нам следует выбрать ту, которая должна быть проинсталлирована на компьютере, например, пусть это будет версия 2015.007.20033. для того, чтобы установить именно эту версию ридера, следует для команды Install-Package -Name AdobeReader добавить параметр –RequiredVersion со значением 2015.007.20033, который определяет точную версию пакета, который вы хотите установить. Также вы можете установить максимально доступную версию продукта, добавив параметр MaximumVersion с соответствующим значением. Вывод этих команд виден на следующей иллюстрации:
Рис. 7. Установка программного продукта определенной версии
Если вам нужно установить свежайшую версию программного продукта и в то же время вы не хотите вводить в оболочке PowerShell несколько команд, вы можете обобщить поиск и установку пакета при помощи конвейера. Например, в случае с установкой последней версии текстового редактора Notepad++ вы можете выполнить следующую команду: Find-Package -Name NotepadPlusPlus | Install-Package –Force. Таким образом, вы выполняете поиск пакета в репозитории и в случае нахождения результата сразу инсталлируете его в тихом режиме. Процесс выполнения установки этого программного продукта виден ниже:
Рис. 8. Установка Notepad++
Теперь, так как согласно указанному выше заданию осталось установить еще Process Explorer, Process Monitor и WinRar, попробуем установить сразу несколько программных пакетов. Для этого желательно точно знать, как называются эти пакеты в самом репозитории. Как я уже писал ранее, это можно проверить при помощи командлета Find-Package | Out-GridView. После того как будут известны имена пакетов можно заняться самой установкой. Для этого вы можете выполнить следующую команду: Find-Package -Name procexp, procmon, winrar | Install-Package. В данном примере, как видно на следующей иллюстрации, я специально не указываю параметр Force, чтобы вы могли обратить внимание на весь процесс установки нескольких программных пакетов одновременно.
Рис. 9. Установка нескольких программ одновременно
-