Такая мега-полезная фича как 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
А что вы думаете по этому поводу?