Створення віддалених сесій в powershell 2

Я зрозумів, що творці PowerShell були трохи ледачі, і це добре. Вони не хотіли кодувати параметр -ComputerName для кожної команди, тому створили загальну систему під назвою «віддалене взаємодія». По суті, ця система активує будь-яку команду для запуску на віддаленому комп'ютері. Ви навіть можете запускати різні команди, які існують на віддаленому комп'ютері, але відсутні на вашому. Це означає, що вам не потрібно постійно встановлювати кожну команду на своїй робочій станції. Ця віддалена система дуже ефективна і дає ряд цікавих адміністративних можливостей

ARUBA INSTANT WI-FI: ПРОСТІ, ПОТУЖНІ, ДОСТУПНІ

Коли я почав використовувати PowerShell, я захопився командою Get-Service і зауважив, що у неї є параметр -ComputerName. Чи не означає це, що можна підключитися до служби і з інших комп'ютерів? Після проведення ряду експериментів я виявив, що це якраз те, що написано. Я зацікавився і почав шукати параметри -ComputerName у інших команд. І засмутився, коли з'ясував, що їх було тільки кілька.

PowerShell режимі можливі два види віддаленого взаємодії: віддалене взаємодія один до одного (1: 1) і віддалене взаємодія один до декількох (1: n). Перш ніж розповісти про них, хочу пояснити деякі основи.

Основи віддаленого взаємодії в PowerShell

Всі команди PowerShell виробляють об'єкти в якості вихідних даних. Коли ви запускаєте команду віддалено, її вихідні дані потрібно надати форму, яку можна легко передавати по мережі, використовуючи протокол HTTP або HTTPS. Так, PowerShell автоматично перетворює вихідні об'єкти в файли XML, які передаються по мережі. Досягнувши вашого комп'ютера, вони перетворюються назад в об'єкти, з якими може працювати PowerShell. Однак ці перетворені назад об'єкти насправді є миттєвими знімками. Вони не можуть оновлювати самі себе щохвилини. Таким чином, якщо ви повинні дістатися до об'єктів, які являють собою процеси, що запускаються на віддаленому комп'ютері, то отриманий результат буде вірний тільки для конкретного проміжку часу, протягом якого ці об'єкти були згенеровані. Значення, такі як використання пам'яті і процесора, не зміняться. Більш того, ви не зможете змусити перетворені назад об'єкти зробити що-небудь. Наприклад, ви не можете наказати об'єкту зупинити самого себе. Це основне обмеження віддаленого взаємодії, але воно не завадить вам працювати і виконувати цікаві завдання.

Існує лише кілька базових вимог для того, щоб використовувати систему віддаленого взаємодії.

  • Як ваш комп'ютер (він же локальний комп'ютер) і один з тих, яким ви хочете послати команду (він же віддалений комп'ютер), повинні працювати з Windows PowerShell 2.0? Windows XP є застарілою версією Windows, на яку ви можете встановити PowerShell 2.0. Таким чином, стара версія теж може брати участь у віддаленій сесії.
  • В ідеалі локальний і віддалений комп'ютери повинні бути членами одного домену або членами довірених / довіряють доменів. З системою віддаленого взаємодії можна працювати і поза домену, але це складно, і тут я про це розповідати не буду. Щоб дізнатися більше про цей сценарій, зверніться до розділу PowerShell Help, де йдеться про Remote_Troubleshooting.

огляд WinRM

Тепер перейдемо до WinRM, оскільки вам необхідно задавати настройки цієї служби для запуску віддаленого взаємодії. Знову повторюся, потрібно тільки задати налаштування віддаленого взаємодії WinRM і PowerShell на віддаленому комп'ютері. У більшості середовищ, в яких я працював, адміністратори активували систему віддаленого взаємодії на кожному комп'ютері, що працює з версіями XP або новішими. Це дає можливість проникати в настільні та портативні комп'ютери непомітно, що може бути дуже корисним (це означає, що користувачі таких комп'ютерів не знатимуть, що ви робите).

Найпростішим способом виконання обох завдань є запуск PowerShell від імені адміністратора і виконання команди Enable-PSRemoting. Ви можете подивитися керівництво по іншій команді, яка називається Set-WSManQuickConfig. Немає потреби запускати команду. Це зробить за вас Enable-PSRemoting, і вона ж виконує ще кілька кроків, які необхідні для встановлення віддаленого взаємодії і роботи. По суті, команда Enable-PSRemoting запускає службу WinRM, задає її налаштування для запуску автоматично, реєструє PowerShell як кінцеву точку і навіть встановлює виключення в Windows Firewall для того, щоб дозволити вхідний трафік WinRM.

WinRM 2.0 (який застосовується PowerShell) за замовчуванням використовує порт TCP 5985 для HTTP і порт 5986 для HTTPS. Це гарантує, що WinRM не конфліктуватиме з локально встановленими веб-серверами, які налаштовані на прослуховування портів 80 і 443. Ви можете задати налаштування WinRM для використання альтернативних портів, але я не рекомендую цього робити. Їли ви залишите ці порти, всі команди віддаленого доступу PowerShell працюватимуть нормально. Якщо ви зміните ці порти, вам доведеться завжди вказувати альтернативний порт при запуску команди віддаленого доступу. Це означає, що вам доведеться більше друкувати. Якщо вам конче потрібно змінити порт, можете ввести команду:

Цифри 1234 означають порт, який вам потрібен. Тут ця команда написана в кілька рядків, але вам потрібно вводити її в один рядок. Те ж саме стосується і всіх інших команд, описаних в статті. Якщо необхідно використовувати HTTPS замість http, ви можете видозмінити цю команду, щоб налаштувати новий порт HTTPS. Повинен зізнатися, що є спосіб визначити установки WinRM на локальних комп'ютерах для того, щоб задіяти альтернативні порти за замовчуванням. Таким чином, вам не потрібно постійно визначати альтернативний порт, коли ви запускаєте команду віддаленого доступу. Але давайте попрацюємо з настройками за замовчуванням, заданими Microsoft.

Якщо покопатися в налаштуваннях GPO в Remote Shell, ви помітите, що можете задати, наприклад, наскільки довго віддалена сесія буде залишатися неактивній до того, як сервер перерве її; як багато одночасно діючих користувачів можуть звертатися до віддаленого сервера за один раз; як багато пам'яті і процесів кожна віддалена оболонка може використовувати; максимальну кількість віддалених оболонок, які користувачі можуть відкривати за один раз. Ці настройки допоможуть переконатися, що ваші сервери не перевантажені забудькуватими адміністраторами. Однак за замовчуванням необхідно бути адміністратором, щоб використовувати віддалене взаємодія, тому вам не варто турбуватися про звичайних користувачів, що засмічують ваші сервери.

Віддалене взаємодія 1: 1

Використовуючи віддалене взаємодія 1: 1, ви, по суті, отримуєте доступ до командного рядка на одному віддаленому комп'ютері. Будь-які команди, які ви даєте, запускаються прямо на віддаленому комп'ютері, а ви бачите результати у вікні командного рядка. Почасти це схоже на використання Remote Desktop Connection, якщо не брати до уваги того, що ви обмежені середовищем командного рядка PowerShell. Система віддаленого взаємодії PowerShell використовує частину ресурсів, які вимагає Remote Desktop, тому вона надає набагато менший вплив на ваші сервери.

Для того щоб встановити з'єднання 1: 1 з віддаленим комп'ютером, названим Server-R2, потрібно запустити

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

Частина [server-r2] інформує вас про те, що все, що ви робите, відбувається на Server-R2. Після цього ви можете запустити будь-які команди, які хочете. Ви навіть можете імпортувати будь-які модулі і додати розширення PowerShell (PSSnapins), які будуть розташовуватися на віддаленому комп'ютері.

Навіть дозволу залишаться ті ж самі. Ваша копія PowerShell буде працювати з тим же маркером безпеки, з яким вона запущена. PowerShell робить це за допомогою Kerberos, тому не передає імені та пароля користувача по мережі. Будь-яка команда, яку ви запускаєте на віддаленому комп'ютері, буде запускатися під вашими обліковими даними, тому все, на виконання чого ви маєте дозвіл, ви зможете робити. Це схоже на реєстрацію прямо з консолі комп'ютера і використання копії PowerShell даного комп'ютера. Це майже так. Ось кілька відмінностей.

  • Якщо у вас є сценарій PowerShell для вашого профілю на віддаленому комп'ютері, він не буде запускатися, коли ви під'єднали, використовуючи систему віддаленого доступу. Простіше кажучи, профілі є пакетом команд, які автоматично запускаються кожен раз, коли ви відкриваєте вікно командного рядка. Вони використовуються для автоматичного завантаження розширень, модулів і тому подібного.
  • Ви обмежені політикою Execution Policy віддаленого комп'ютера. Скажімо, політика вашого комп'ютера встановлюється на RemoteSigned так, що ви можете запускати локальні непідписані сценарії. Якщо політика віддаленого комп'ютера встановлена ​​в Restricted (настройка за замовчуванням), вона не дозволить запускати ніякі сценарії, коли ви взаємодієте віддалено.

Багато команд PowerShell йдуть в парах: одна робить щось, інша - протилежне цьому. У нашому випадку Enter-PSSession під'єднує вас до віддаленого комп'ютера, а Exit-PSSession закриває цю сполуку. Exit-PSSession не потрібні ніякі параметри. Після запуску віддалене з'єднання закривається, і запрошення вашого вікна командного рядка повертається назад до нормального вигляду. А що якщо ви забудете запустити Exit-PSSession? Не турбуйтесь. PowerShell і WinRM здатні з'ясувати, що ви зробили, і закрити в разі необхідності віддалене з'єднання.

Хочу дати одну пораду. Коли ви під'єднується до віддаленого комп'ютера, не запускайте на ньому Enter-PSSession до тих пір, поки повністю не усвідомлюєте, що ви робите. Наприклад, ви працюєте на ComputerА. Ви під'єднують до Server-R2. У рядку PowerShell ви запускаєте

Тепер Server-R2 містить відкрите з'єднання з Server-DC4. Це створює «ланцюг віддаленого взаємодії», яку відстежити складно. Крім того, ваші сервери без потреби виявляються перевантаженими. Можуть бути моменти, коли ви повинні будете робити це (наприклад, Server-DC4 знаходиться за брандмауером і ви не можете отримати до нього прямий доступ, тому в якості посередника вам потрібно використовувати Server-R2). Однак загальне правило полягає в наступному: намагайтеся уникати ланцюжків віддаленого взаємодії.

Віддалене взаємодія 1: n

Одна з найцікавіших речей в PowerShell - це віддалене взаємодія 1: n. Воно дозволяє вам надсилати команди на кілька віддалених комп'ютерів одночасно - повномасштабні розподілені обчислення. Кожен комп'ютер окремо буде виконувати команду і відсилати вам результати. Все робиться за допомогою команди Invoke-Command в такому вигляді:

Команда в зовнішніх фігурних дужках передається на всі три віддалених комп'ютера. За замовчуванням PowerShell може розмовляти з 32 комп'ютерами відразу. Якщо ви визначаєте більш ніж 32 комп'ютери, вони будуть збудовані в чергу. Потім, коли один комп'ютер завершує роботу, команду виконує наступний. Якщо у вас дійсно швидкісна мережа і потужні комп'ютери, ви можете збільшити їх кількість, використовуючи параметр ThrottleLimit команди. Прочитати про те, як використовувати цей параметр в Invoke-Command, ви можете на сторінці Help.

Єдиний параметр, якого ви не побачите на сторінці Help цієї команди, - параметр Command. Він, як я вже показав, працює прекрасно. Параметр Command є псевдонімом або коротким ім'ям для параметра ScriptBlock, який вказаний на сторінці Help. Для мене простіше використовувати Command, тому я схильний задіяти саме його замість ScriptBlock, проте вони працюють однаково.

Якщо ви прочитали сторінку Help для Invoke-Command уважно, ви також помітили параметр, який дозволяє вказувати файл сценарію, а не команду. Параметр FilePath дозволяє посилати сценарій на віддалені комп'ютери; це означає, що ви можете автоматизувати деякі складні завдання, а кожен комп'ютер буде виконувати свою частку роботи.

Тепер зупинимося на параметрі Computer Name. У прикладі коду Invoke-Command у мене був список імен комп'ютера, розділений комами. Якщо у вас багато комп'ютерів, то ви, можливо, не буде використовуватись для друку їхні імена кожного разу, коли під'єднується до них. Замість цього ви можете створити текстовий файл, який містить по одному імені комп'ютера на одному рядку, без ком, лапок або чогось ще. Наприклад, якби ваш текстовий файл був названий webservers.txt, ви б використовували такий код:

Круглі дужки змушують PowerShell виконувати спочатку команду Get-Content - це схоже на те, як працюють круглі дужки в математиці. Потім результати Get-Content вкладаються в параметр -ComputerName.

Можливий також запит імені комп'ютера в Active Directory, але це складніше. Для того щоб знайти комп'ютер, ви можете використовувати команду Get-ADComputer, але ви не вставите цю команду в круглі дужки, як робили це в Get-Content. Чому ні? Get-Content видає прості текстові рядки, тоді як Get-ADComputer виробляє об'єкти типу «комп'ютер». Параметр -ComputerName очікує рядки. Якби він мав отримувати об'єкти «комп'ютер», то не знав би, що з ними робити. Тому, якщо ви хочете використовувати Get-ADComputer, вам потрібно отримати значення з властивості Name комп'ютерних об'єктів. Ось так:

В круглих дужках комп'ютерні об'єкти передаються команді Select-Object, а параметр -Expand використовується для з'ясування властивості Name цих комп'ютерних об'єктів. Результат вираження в дужках - це набір імен комп'ютера, а не комп'ютерних об'єктів. Імена комп'ютерів - це якраз те, що потрібно параметру -Computer Name.

для того, щоб завантажити команди для служби каталогів в командну оболонку, щоб їх можна було використовувати.

Є дещо ще!

Всі ці приклади були наведені для тимчасових сесій віддаленого взаємодії. Якщо ви збираєтеся відновити з'єднання з тими ж самими комп'ютерами (або комп'ютером) кілька разів за короткий проміжок часу, ви можете створити повторно використовувані, постійні сесії. Це дуже корисно, якщо з'єднання вимагає альтернативних облікових даних, номера порту не за замовчуванням або чогось ще, що вимагає додаткових параметрів.

Щоб створити постійні сесії, потрібно використовувати команду New-PSSession, потім зберегти їх у змінній для легкого доступу. Наприклад, наступний код створює сесію віддаленого взаємодії з трьома комп'ютерами і зберігає їх у змінній $ sessions:

Сесії віддаленого взаємодії закриваються автоматично, коли ви закриваєте командну оболонку, але до цього часу вони можуть займати пам'ять і трохи завантажувати процесор на локальної та дистанційної системах. Для того щоб точно закрити їх, ви можете використовувати команду Remove-PSSession:

Коли вам потрібно знову відкрити сесії, ви можете задіяти команду Invoke-Command:

Або можете застосувати Enter-PSSession:

Зауважте, що в коді Enter-PSSession тільки одна сесія віддаленого взаємодії відкривається повторно. Мінлива індексу 1 повідомляє PowerShell, що він повинен знову відкрити сесію з комп'ютером, названим Two (індекс відраховується з нульового значення).

Як ми бачимо, користі від віддаленого взаємодії PowerShell дуже багато. Якщо ви будете використовувати його, ви переконаєтеся, як сильно він розширить горизонти вашої діяльності.

Поділіться матеріалом з колегами і друзями

Схожі статті