Главная

Friday, 27 August 2021

Используем PowerShell Remoting.

Всем привет.

Такая мега-полезная фича как PowerShell Remoting основана на реализации протокола Web Services for Management (WS-Management), а для связи использует службу  Windows Remote Management (WinRM). Связь между компьютерами осуществляется по HTTP или HTTPS. Весь трафик между двумя компьютерами шифруется на уровне протокола (за исключением случаев, когда используется SSL). Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos.

В отличие от утилит, использующих различные программные интерфейсы, PS Remoting работает следующим образом: команды, вводимые на локальном компьютере, передаются на удаленный компьютер и там выполняются, затем результат передается обратно. Поскольку все команды выполняются локально, нет необходимости заботится о совместимости. Кроме того, для работы PS Remoting нужен всего один открытый порт 5985(или 5986) на брандмауэре.

Но сперва надо подготовить удаленный хост PC1 к внешним запросам:

Enable-PSRemoting -Force

Эта комадна устанавливает следующее:

- WinRM start automatically

- WinRM accept remoting requests

- Firewall allow remoting requests

Также следует изменить тип сети на частную (private) так:

Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private

или использовать команду:

Enable-PSRemoting –SkipNetworkProfileCheck

Также нужно включить правило Window Defender Firewall, которое разрешает доступ к WinRM в общедоступных сетях:

Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any

Чтобы проверить подключение к удаленному компьютер через PowerShell Remoting используется команда:

Test-WsMan PC1

Точно также вы можете протестировать, можно ли подключится через PowerShell Remoting к компьютеру локально:

Test-WSMan localhost

Готово. Теперь нам не помешает узнать как командлеты поддерживают запросы к другим хостам:

Get-Command -ParameterName ComputerName

Далее для пробы выполним запрос на состояние службы BITS на удаленном хосте РС1:

Get-Service -Name BITS -ComputerName PC1 -Credential domain\username

Тот же запрос через ScriptBlock:

Invoke-Command -ScriptBlock  { Get-Service -Name BITS } -ComputerName PC1 -Credential domain\username

Командлет Enter-PSSession позволяет создать постоянную интерактивную PowerShell сессию с удаленным компьютером. Все команды, которые вы вводите в вашей командной строке,  выполняются на удаленном компьютере. Откроем сессию на удаленном хосте и выполним запрос интерактивно:

Enter -PSSession -ComputerName PC1 -Credential domain\username

[PC1]: >Get-Service -Name BITS 

[PC1]: >Exit-PSSession

Теперь проверим активность сессии. Открываем новую сессию на удаленном хосте и выполняем запрос через ScriptBlock:

$S = New-PSSession -ComputerName PC1 -Credential domain\username

Invoke-Command -Session $S -ScriptBlock {$PSVersionTable.PSVersion}

Или выполним скрипт из файла:

Invoke-Command -Session $S -FilePath c:\PS\Scripts\GetComputerInfo.ps1

Выходим из сессии, но не убиваем ее:

Disconnect-PSSession $S

Это же можно было сделать одной строкой:

Invoke-Command -Session $S -ScriptBlock {Start-Service spooler} -Disconnected

Проверяем активные сессии:

Get-PSSession

Убить активную сессию можно так:

Remove-PSSession $S


Для запуска команд на удаленных компьютерах через Invoke-Command в фоновом режиме используется специальный атрибут –AsJob. В этом случае результат выполнения команды не возвращается в консоль. Чтобы получить результаты нужно использовать командлет Receive-Job:

Invoke-Command -Session $S -ScriptBlock {Get-Service spooler | Stop-Service -Force} -AsJob

Get-Job -Id 5 | Receive-Job

К активной сессии можно подсоединится с третьего хоста. Подключаемся к сессии Job5 и с помощью командлета Receive-PSSession получаем результат выполнения задания:

Connect-PSSession -Name Job5 -ComputerName PC1

Receive-PSSession -Name Job5 -Keep

Или даже без явного подключения к сессии:

$session = Get-PSSession -Name Job5 -ComputerName PC1

$job = Receive-PSSession $S -OutTarget Job

Receive-Job $job -Keep

А так можно выполнить копирование файлов между активными сессиями:

>Copy-Item -Path c:\file.txt -FromSession $S1

>Copy-Item -Path file.txt -Destination $S1 -ToSession $S2

Разумеется могут быть нюансы аутентификации и шифрования трафика в PowerShell Remoting при использовании HTTPS. А также ограничения списка разрешенных хостов для запросов. Об этом толково описано здесь и здесь

Успехов.



No comments:

Post a Comment

А что вы думаете по этому поводу?