Дистанційне керування за допомогою PowerShell
Існує досить багато методів для роботи з віддаленими комп'ютерами. Є Windows Management Instrumentation (WMI), що широко використовується в VBScript. Існують різні утиліти, які дозволяють здійснювати віддалене управління, типу PSExec від Sysinternals. Навіть багато командлетів PowerShell мають ComputerName для виконання на віддалених комп'ютерах.
Загалом методів повно, але в кожного є свої мінуси. По-перше — різний синтаксис, у якому легко заплутатися. По-друге, деякі команди поводяться по-різному залежно від того, локально чи віддалено вони виконуються. Ну і нарешті, для зв'язку може знадобитися відкриття додаткових портів на брандмауері, що немає добре з погляду безпеки.
PowerShell Remoting вирішує більшість описаних проблем. Він базується на Microsoft реалізації протоколу Web Services for Management (WS-Management), а для зв'язку використовує службу Windows Remote Management (WinRM). Зв'язок між комп'ютерами здійснюється за HTTP (за промовчанням) або HTTPS. Весь трафік між двома комп'ютерами шифрується лише на рівні протоколу (крім випадків, коли використовується SSL). Підтримуються кілька методів автентифікації, включаючи NTLM та Kerberos.
На відміну від утиліт, що використовують різні програмні інтерфейси, PS Remoting працює наступним чином: команди, що вводяться на локальному комп'ютері, передаються на віддалений комп'ютер і виконуються, потім результат передається назад. Оскільки всі команди виконуються локально, немає необхідності дбати про сумісність. Крім того, для роботи PS Remoting потрібен лише один відкритий порт на брандмауері.
Є кілька способів керування за допомогою PowerShell Remoting.
Управління "один до одного"
Найпростіший спосібдистанційного керування — інтерактивно відкрити віддалену сесію і в ній виконати потрібні дії. Наприклад, відкриємо сесію на комп'ютер 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 .
Слід пам'ятати, що під час роботи у фоновому режимі PowerShell не повертає результат. Для його отримання доведеться скористатися командлетом Receive-Job.
Для того, щоб виконати не пару-трійку команд, а якийсь скрипт, Invoke-Command має параметр –FilePath , який можна використовувати замість –ScriptBlock для визначення файлу сценарію. Наприклад, я створив скрипт, який виводить список зупинених служб і запустив його на віддаленій машині SRV4:
Invoke-Command -FilePath .\script.ps1 -ComputerName SRV4

Управління «один до багатьох»
Досить частина виникає необхідність паралельно виконати одне завдання кількох комп'ютерах. Це досить легко можна зробити за допомогою того ж Invoke-Command. Наприклад, імена комп'ютерів можна просто перерахувати через кому:
Invoke-Command -ScriptBlock -ComputerName SRV4,SRV5
Помістити у змінну:
$servers = @(″SRV1″,″SRV2″,″SRV3″) Invoke-Command -ScriptBlock -ComputerName $servers
Або взяти з файлу:
Invoke-Command -ScriptBlock -ComputerName` (Get-Content .\servers.txt)

Примітка: Invoke-Command має параметр ThrottleLimit , що обмежує максимальну кількість комп'ютерів, якими можна керувати одночасно. За замовчуванням цей параметр дорівнює 32. При необхідності його можна змінити, але врахуйте, що підвищення цього параметра збільшить навантаження на процесор і пам'ять комп'ютера, тому цю операцію потрібно виконувати з великою обережністю.
Щоразу під час виконання Invoke-Command створюється нова сесія, створення якої витрачається час і ресурси. Щоб цього уникнути, ми можемо відкрити одну сесію, в якій і виконувати всі команди. Наприклад, відкриємо сесію з ім'ям SRV4 на комп'ютер SRV4 і помістимо її в змінну $session, а потім цієї сесії виконаємо наше завдання (зупинимо багатостраждальний spooler):
$session = New-PSSession -ComputerName SRV4 -Name SRV4 Invoke-Command -ScriptBlock ` -Session $session
Сесія буде активною до того моменту, поки ми не вийдемо з консолі PowerShell. Також сесію можна закрити - Disconnect-PSSession або видалити - Remove-PSSession.

А тепер кілька цікавих можливостей, що з'явилися на PowerShell 3.0. Якщо раніше при виході з сесії або закритті консолі сесія видалялася, то PS 3.0 при закритті сесія перетворюється на станdisconnected. Ми можемо відкрити новий сеанс на цьому ж (або будь-якому іншому) комп'ютері та виконати команду прямо у цій відключеній сесії. Як приклад стартуємо на комп'ютері SRV4 сервіс друку, зупинений минулого разу:
Invoke-Command -ScriptBlock ` -ComputerName SRV4 -Disconnected

Ще один варіант використання відключених сесій – запуск тривалих за часом завдань. Наприклад відкриємо сесію з ім'ям LongJob на SRV4 і запустимо в ній фонове завдання, яке виводитиме список сервісів з інтервалом в 1 хвилину:
$session = New-PSSession -ComputerName SRV4 -Name LongJob Invoke-Command -Session $session -ScriptBlock` > -AsJob
Подивимося, як виконується завдання та закриємо сесію:
Receive-Job -Name Job2 Disconnect-PSSession $session

Ідемо на інший комп'ютер і відкриваємо консоль, Підключаємося до сесії LongJob і за допомогою командлета Receive-PSSession отримуємо результат виконання завдання:
Connect-PSSession -Name LongJob -ComputerName SRV4 Receive-PSSession -Name LongJob

Або ще варіант, без явного підключення до сесії за допомогою Connect-PSSession:
$session = Get-PSSession -Name LongJob -ComputerName SRV4 $job = Receive-PSSession $session -OutTarget Job Receive-Job $job

Примітка: для того, щоб результат залишився в системі, Receive-Job треба використовувати з параметром -Keep.
Неявне віддалене керування
Ще один, досить нестандартний спосіб віддаленого керування – неявне віддалене керування (Implicit remoting). Використовуючи його можна, не створюючи віддаленої сесії, локально виконувати командлети на віддаленому комп'ютері.
Наприклад беремо звичайну робочу станцію, без встановлених засобів віддаленого адміністрування. Створюємо віддалену сесію з контролером домену SRV4 та імпортуємо до цієї сесії модуль Active Directory:
$session = New-PSSession -ComputerName SRV4 Invoke-Command -Session $session
Потім експортуємоз віддаленої сесії командлети Active Directory та поміщаємо їх у локальний модуль RemoteAD:
Export-PSSession -Session $session -CommandName *-AD* -OutputModule RemoteAD` -AllowClobber
Ця команда створить у папці WindowsPowerShell\Modules\RemoteAD новий модуль PowerShell. Завантажені будуть лише командлети з іменами, що відповідають шаблону *-AD*. При цьому командлети не копіюються на локальний комп'ютер. Локальний модуль служить свого роду ярликом, а самі команди виконуватимуться на віддаленому контролері домену.
Після створення модуля віддалену сесію можна закрити, вона більше не знадобиться.

Імпортуємо новий модуль у поточний сеанс (у PS 3.0 можна цей крок пропустити):
А тепер увага — ми не відкриваємо віддаленої сесії з контролером домену, де розташовані командлети. Не потрібно явно запускати цей сеанс - це можна зробитинеявно, спробувавши виконати віддалені командлети:
New-ADUser -Name BillGates -Company Microsoft Get-ADUser BillGates
При цьому буде відновлено віддалене підключення до контролера домену, після чого команду буде передано на контролер домену і там виконано. Результат виконання буде серіалізовано в XML і передано по мережі на локальний комп'ютер, де буде виконано десеріалізацію в об'єкти, з якими може працювати PowerShell.
Віддалений сеанс буде активним, доки ви не закриєте консоль або не видаліть модуль RemoteAD.

Неявне дистанційне керування дозволяє працювати з командлетами на віддаленому комп'ютері практично так само, як якщо б вони були встановлені на локальній машині. При цьому всі потрібні командлети завжди під рукою, що досить комфортно.
Насамкінець скажу, що на даний момент PowerShell Remotingє основним інструментом для віддаленого керування операційними системами Windows. Тому знати про його можливості та вміти ними користуватися просто необхідно будь-якому Windows адміністратору.