PowerShell Remoting отличный инструмент, который позволяет подключаться и выполнять команды на удаленных компьютерах через WinRM. Если компьютеры находятся в одном домене Active Directory, то PSRemoting использует Kerberos для аутентификации на удалённых хостах. Однако, если ваши компьютеры находятся в рабочей группе, то для аутентификации придется использовать NTLM (TrustedHosts) или SSL сертификаты. В этой статье мы рассмотрим, как настроить PSRemoting для удаленного подключения к компьютеру в рабочей группе.
В нашем примере в локальной сети на базе рабочей группы Windows есть два хоста:
- Рабочая станция администратора —
192.168.13.100
- Компьютер пользователя —
192.168.13.222
Наша задача – удаленно подключиться к компьютеру пользователя через PowerShell Remoting.
Прежде всего нужно включить и настроить WinRM на удаленном компьютере. Включить WinRM на удаленном компьютере придется локально или удаленно (например, через RDP или psexec).
Проверьте, что на компьютере запущена служба WinRM:
Get-Service -Name "*WinRM*" | select status
Если служба не запущена, запустите ее:
Enable-PSRemoting
WinRM has been updated to receive requests. WinRM service type changed successfully. WinRM service started. WinRM has been updated for remote management. WinRM firewall exception enabled. Configured LocalAccountTokenFilterPolicy to grant administrative rights remotely to local users.
Если для сетевого подключения на компьютере установлен тип сети Public (общедоступная), то при включении WinRM появится ошибка:
Set-WSManQuickConfig : ... WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again.
Вам нужно изменить тип сети на частную (private) (
Set-NetConnectionProfile -NetworkCategory Private
), или использовать команду:
Enable-PSRemoting –SkipNetworkProfileCheck.
Откройте порт (TCP 5985) для подключения к WinRM в Windows Defender Firewall. Проще всего открыть порт с помощью PowerShell. В этом примере мы откроем удаленный доступ только для IP адреса компьютера администратора (безопаснее), но можно открыть и для всех (укажите Any вместо IP адреса):
Set-NetFirewallRule -DisplayName "Windows Remote Management (HTTP-In)" -RemoteAddress 192.168.13.100
Enable-NetFirewallRule -DisplayName "Windows Remote Management (HTTP-In)"
С компьютера администратора проверьте, что компьютер пользователя теперь разрешает принимать удаленные подключения через PSRemoting:
Test-NetConnection 192.168.13.222 –Port 5985
Test-WsMan 192.168.13.222
Однако, если попытаться удаленно подключиться к компьютеру пользователя с помощью команд Invoke-Command или Enter-PSSession, появится ошибка:
Enter-PSSession 192.168.13.222
Enter-PSSession : Connecting to remote server 192.168.13.222 failed with the following error message: The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. PSRemotingTransportException.
HTTP Listener WinRM на удаленном компьютере разрешает подключение только через Kerberos аутентификацию.
Get-ChildItem -Path WSMan:\localhost\Service\Auth\
Чтобы работала Negotiate аутентификация через NTLM ваш компьютер должны доверять удаленному компьютеру. В домене это достигается с помощью Kerberos, а в рабочей группе придется добавить IP адреса компьютера в TrustedHosts.
Добавьте компьютер пользователя в TrustedHosts на компьютере администратора (можно добавить по IP адресу или FQDN):
Set-Item wsman:\localhost\client\TrustedHosts -Value 192.168.13.222 -Force
get-Item WSMan:\localhost\Client\TrustedHosts
Чтобы очистить список TrustedHosts:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "" –Force
Чтобы добавить новый компьютер в список TrustedHosts, используйте параметр -Concatenate:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.13.200 -Concatenate
Также вы можете разрешить удаленное подключение ко все компьютерам (обычно не рекомендуется, т.к. один из главных недостатков NTLM в том, что он не осуществляет проверку подлинности).
Set-Item wsman:\localhost\Client\TrustedHosts -value *
Попробуйте теперь подключиться к удаленному компьютеру через PSRemoting:
Enter-PSSession -ComputerName 192.168.13.222 -Credential 192.168.13.222\root
Введите пароль администратора удаленного компьютера и убедитесь, что подключение успешно установлено (в строке приглашения PowerShell теперь отображается имя или IP удаленного компьютера).
С помощью Invoke-Command вы можете выполнять команды на удаленных компьютерах. Например, выполнить удалённую перезагрузку компьютера:
Invoke-Command -ComputerName 192.168.13.222 -Credential 192.168.13.222\root –ScriptBlock {Restart-Computer}
Или выполнить PowerShell скрипт:
Invoke-Command -ComputerName 192.168.13.222 -Credential 192.168.13.222\root -FilePath c:\PS\Scripts\GetComputerInfo.ps1
Обратите внимание, что для аутентификации на удаленном компьютере нужно указывать пароль пользователя для подключения с помощью опции –Credential. Если в вашей сети много компьютеров и на каждом из них используется свой пароль локального администратора, удобно хранить пароли подключения в хранилище. Это может быть как локальное хранилище паролей Windows Credential Manager или внешнее хранилище KeePass, LastPass, HashiCorp Vault, Azure Key Vault, Bitwarden.
Для доступа к сохраненным паролям в таком хранилище можно использовать модуль PowerShell Secret Management. Теперь для подключения к удаленному компьютеру через PSRemoting вам достаточно:
- Сохранить пароль для подключения, например в Credential Manager:
cmdkey /add:192.168.13.222 /user:root /pass:Password
- Получить имя и пароль из хранилища с помощью модуля CredentialManager:
$psCred = Get-StoredCredential -Target "192.168.13.222"
- Подключиться к удаленному компьютеру через PSRemoting с сохраненным паролем:
Enter-PSSession -ComputerName 192.168.13.222 -Credential $psCred
Если вы храните пароли в другом типе хранилища, используйте модуль Microsoft.PowerShell.SecretManagement для получения сохранённых учетных данных.
В новых версиях PowerShell(v6 и v7) вы можете использовать протокола Secure Shell (SSH) для подключения к удаленному компьютеру через PowerShell Remoting. Для этого в Windows должен быть включен встроенный SSH сервер. Можно даже аутентифицироваться по SSH с помощью RSA ключа:
Enter-PSSession -HostName [email protected]:22 -KeyFilePath c:\PS\your_rsa_key