Заметки · 08.06.2022

Подключение через PSRemoting

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 *

Эта команда добавит в доверенные узлы правило доступа для всех хостов.