
PowerShell Remoting — это отличный инструмент, который позволяет подключаться и выполнять команды на удаленных компьютерах через WinRM. Если компьютеры подключены к домену Active Directory, то PSRemoting использует Kerberos для аутентификации на удаленных узлах. Однако если ваши компьютеры находятся в рабочей группе, вам придется использовать NTLM (TrustedHosts) или SSL-сертификаты для аутентификации. Давайте рассмотрим, как настроить и использовать PSRemoting (WinRM) в среде рабочей группы (без домена).
В этом примере есть два хоста в рабочей группе Windows:
- Рабочая станция администратора —
192.168.13.100
- Компьютер пользователя —
192.168.13.222
Наша задача — удаленно подключиться к компьютеру пользователя с помощью PowerShell Remoting.
Первым шагом будет включение и настройка WinRM на удаленном хосте. Вам придется включить WinRM локально или удаленно (например, с помощью RDP, psexec или GPO).
Убедитесь, что служба 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.
Если Публика на компьютере установлен тип сетевого подключения, то при включении 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.
Измените тип сети на Частная (Set-NetConnectionProfile -NetworkCategory Private
) или выполните приведенную ниже команду:
Enable-PSRemoting –SkipNetworkProfileCheck
Откройте порт TCP/5985 в брандмауэре Windows Defender Firewall для подключения к WinRM. Самый простой способ — открыть порт в брандмауэре Windows с помощью 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.
WinRM HTTP Listener на удаленном компьютере разрешает подключение только с аутентификацией 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
Введите пароль администратора удаленного компьютера и убедитесь, что соединение установлено успешно (имя хоста или IP-адрес удаленного компьютера отображается в приглашении PowerShell).
Теперь вы можете выполнять команды и сценарии на удаленных компьютерах рабочей группы с помощью команды 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:\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:Password1
- Получите имя и пароль из хранилища с помощью модуля CredentialManager:
$psCred = Get-StoredCredential -Target "192.168.13.222"
- Подключитесь к удаленному компьютеру, используя PSRemoting и сохраненный пароль:
Enter-PSSession -ComputerName 192.168.13.222 -Credential $psCred
В новых версиях PowerShell Core (v6 или v7) вы можете использовать протокол Secure Shell (SSH) для подключения к удаленному компьютеру через PowerShell Remoting. Для этого в Windows должен быть включен встроенный SSH-сервер.
[-HostName
(вместо -ComputerName) и -UserName
(вместо -Credential) позволяют задать имя компьютера и пользователя для SSH-соединения.
Enter-PSSession -HostName 192.168.50.20 -UserName maxbak
Вы даже можете аутентифицироваться в Windows с помощью SSH-ключа (используйте параметр –KeyFilePath
параметр, указывающий путь к закрытому SSH-ключу):
Enter-PSSession -HostName [email protected]:22 -KeyFilePath c:\PS\your_rsa_key