PSRemoting позволяет создавать консольную сессию управления на удалённом компьютере. Это выглядит так, будто Вы запустили PowerShell на компьютере, находясь непосредственно за ним. Конечно, у большей части командлетов PS есть параметр -ComputerName, который позволяет выполнять операции на удалённом хосте, но не все операции можно выполнить данным методом.
Например, запросить текущий часовой пояс на удалённом хосте командлетом Get-TimeZone напрямую не получится. Хотя можно попробовать и вот так:
# Задать переменной имя хоста #
$hostname = Read-Host "Имя компьютера"
# Отправить команду на удалённый компьютер #
Invoke-Command -ComputerName $hostname -ScriptBlock { Get-TimeZone }
# Ожидание действия от пользователя #
Read-Host
Но это удалённый вызов команды на удалённом хосте и он прекрасно работает для лаконичных запросов, но сейчас речь о более объёмном методе…
Как включить PSRemoting?
Прежде всего, на всех хостах, к которым нужно будет подключаться, должна быть включена служба WinRM и разрешен удалённый доступ с помощью PowerShell.
На отдельно взятых компьютерах можно провести быструю конфигурацию PSRemoting одной командой от имени администратора:
Enable-PSRemoting
Эта команда сконфигурирует и переведёт в автозапуск службу WinRM, которая будет прослушивать 5985 порт. Также будет создано соответствующее правило в брандмауэре операционной системы.
Важный момент: если настраиваемый компьютер подключён к сети с профилем «Публичная сеть» — командлет может выдать ошибку и откажется проводить конфигурацию.
Нужно будет или сменить профиль, или задать параметр для игнорирования профиля сети:
Enable-PSRemoting -SkipNetworkProfileCheck
Вызвать смену профиля сети можно командлетом:
Set-NetConnectionProfile
Если речь идёт о компьютерах в домене — поменять профиль сети не получится. Командлет выдаст ошибку: Unable to set NetworkCategory to ‘DomainAuthenticated’. This NetworkCategory type will be set automatically when authenticated to a domain network.
В домене PSRemoting конфигурируется групповыми политиками: разрешается автоматический запуск службы удаленного управления Windows (WS-Management) и конфигурируется административный шаблон политики конфигурации компьютера «Разрешить удаленное администрирование сервера средствами WinRM«. Подробнее о формировании групповой политики можно почитать здесь или здесь.
Непосредственно сабж
Удалённая консольная сессия создаётся командлетом:
Enter-PSSession -ComputerName ИМЯ_ПК
Закрывается сессия командлетом:
Exit-PSSession
Для подключения через PSRemoting я использую вот такую конструкцию напрямую из среды сценариев PowerShell ISE:
# Задать переменной имя хоста # $hostname = Read-Host 'Имя компьютера для управления' # Выполнить запуск службы WinRM, если она не запущена # Set-Service -ComputerName $hostname -Name WinRM -Status Running -PassThru | Out-Null # Запустить удалённую сессию # Enter-PSSession -ComputerName $hostname # Выйти из сессии # # Exit-PSSession
Второй командлет (Set-Service) — страховочный пояс на случай, если служба WinRM по каким-то (только ей ведомым причинам) не отвечает на запросы.
Последний командлет я «заковал» в комментарий, чтобы он не обрывал соединение сразу после его создания. Exit-PSSession применяю отдельно — выполнением выделенной части сценария (F8).
Ещё одна ремарка: если во время подключения возникла ошибка, связанная с доверенными узлами, выполняем:
set-item wsman:localhost\client\trustedhosts -value *
Эта команда добавит в доверенные узлы правило доступа для всех хостов.