Віддалене управління за допомогою 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 {Restart-Service spooler} -ComputerName SRV4
Ця команда відкриє віддалену сесію на SRV4, виконає блок команд, вказаний в параметрі -ScriptBlock, і закриє сесію.А щоб завдання виконувалося в фоновому режимі, додатково можна вказати параметр -AsJob.
Cледует пам'ятати про тому, що при роботі в фоновому режимі PowerShell не повертає результат. Для його отримання доведеться скористатися Командлети Receive-Job.
Для того, щоб виконати не пару- трійку команд, а будь-якої скрипт, у Invoke-Command є параметр -FilePath, який можна використовувати замість -ScriptBlock для визначення файлу сценарію.Для прикладу я створив скрипт, який виводить список зупинених служб і запустив його на віддаленій машині SRV4:
Invoke-Command -FilePath. \ Script.ps1 -ComputerName SRV4
Управління «один до багатьох»
Досить частина виникає необхідність паралельно виконати одну задачу на декількох комп'ютерах.Це досить легко можна зробити за допомогою того ж Invoke-Command. Наприклад, імена комп'ютерів можна просто перерахувати через кому:
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName SRV4, SRV5
Помістити в змінну:
$ servers = @ ( "SRV1", "SRV2", "SRV3")
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName $ servers
Або взяти з файлу:
Invoke-Command -ScriptBlock {Restart-Service spooler} -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 {Get-Service spooler | Stop-Service} `
-Session $ session
Сесія буде активна до того моменту, поки ми не вийдемо з консолі PowerShell.Також сесію можна закрити - Disconnect-PSSession або видалити - Remove-PSSession.
А тепер кілька цікавих можливостей, що з'явилися в PowerShell 3.0. Якщо раніше при виході з сесії або закриття консолі сесія віддалялася, то в PS 3.0 при закритті сесія переходить в стан disconnected.Ми можемо відкрити новий сеанс на цьому ж (або будь-якому іншому) комп'ютері і виконати команду прямо в цій відключеною сесії. Як приклад стартуємо на комп'ютері SRV4 сервіс друку, зупинений в минулий раз:
Invoke-Command -ScriptBlock {Start-Service spooler} `
-ComputerName SRV4 -Disconnected
Ще один варіант використання відключених сесій - запуск тривалих за часом завдань.Для прикладу відкриємо сесію c ім'ям LongJob на SRV4 і запустимо в ній фонове завдання, яке буде виводити список сервісів з інтервалом в 1 хвилину:
$ session = New-PSSession -ComputerName SRV4 -Name LongJob
Invoke-Command -Session $ session -ScriptBlock`
{Get-Service | foreach {$ _; sleep 60}} -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 {Import-Module ActiveDirectory} -Session $ session
Потім експортуємо з віддаленої сесії командлети Active Directory і поміщаємо їх в локальний модуль RemoteAD:
Export-PSSession -Session $ session -CommandName * -AD * -OutputModule RemoteAD`
-AllowClobber
Ця команда створить в папці WindowsPowerShell \ Modules \ RemoteAD новий модуль PowerShell.Завантажені будуть тільки командлети з іменами, відповідними шаблоном * -AD *. При цьому самі командлети чи не копіюються на локальний комп'ютер. Локальний модуль служить свого роду ярликом, а самі команди будуть виконуватися на віддаленому контролері домену.
Після створення модуля віддалену сесію можна закрити, вона більше не знадобиться.
Імпортуємо новий модуль в поточний сеанс (в PS 3.0 можна цей крок пропустити):
Import-Module RemoteAD
А тепер увага - ми не відкриваємо віддалену сесію з контролером домену, де розташовані командлети. Не потрібно явно запускати цей сеанс - це можна зробити неявно, спробувавши виконати віддалені командлети:
New-ADUser -Name BillGates -Company Microsoft
Get-ADUser BillGates
При цьому буде відновлено віддалене підключення до контролера домену, після чого команда буде передана на контролер домену і там виконана.Результат виконання буде серіалізовані в XML і переданий по мережі на локальний комп'ютер, де буде виконана десеріалізацію в об'єкти, з якими може працювати PowerShell.
Віддалений сеанс буде активним до тих пір, поки ви не закриєте консоль або не видалите модуль RemoteAD.
Неявне віддалене управління дозволяє працювати з командлети на віддаленому комп'ютері практично так само, як якби вони були встановлені на локальній машині.При цьому всі необхідні командлети завжди під рукою, що досить зручно.
На закінчення скажу, що на даний момент PowerShell Remoting є основним інструментом для віддаленого управління операційними системами Windows. Тому знати про його можливості і вміти ними користуватися просто необхідно будь-якому Windows-адміністратору.П>.