Командлет Enter-PSSession позволяет создать постоянную интерактивную PowerShell сессию с удаленным компьютером. Все команды, которые вы вводите в вашей командной строке, выполняются на удаленном компьютере. В этой статье мы рассмотрим основные возможности и особенности использования командлета Enter-PSSession для удаленного управления компьютерами с Windows 10 и Windows Server 2019/2016.
Для подключения в самом простом случае нужно указать только имя компьютера (параметр ComputerName). Чтобы подключиться к удаленному компьютеру, достаточно выполнить команду:
Enter-PSSession hq-srv01.contoso.com
Если у текущего пользователя есть полномочия на подключение к удаленному серверу, вы подключитесь к удаленному компьютеру.
Можно перед подключением запросить учетные записи пользователя:
Enter-PsSession –ComputerName hq-srv01.contoso.com –Credentials contoso\kbuldogov
Или так:
$creds = Get-Credential
Enter-PSSession -ComputerName hq-srv01 -Credential $creds
Обратите внимание, что в начале командной строки PowerShell теперь в квадратных скобках указывается имя удаленного компьютера (
[hq-srv01.contoso.com]
). Это позволяет понять, работаете ли вы в локальной сессии или в удаленной.
В вашей консоли отображаются результаты всех команд, выполненных удаленно. Можно выполнить команду hostname и убедится, что вы выполнили команду на удаленном компьютере.
В этой интерактивной командной строке вы можете выполнять любые команды (в соответствии со своими полномочиями).
Например, выведем настройки сети:
Get-NetIPConfiguration
Можно изменить настройки DNS на удаленном компьютере:
Set-DNSClientServerAddress –InterfaceIndex 6 –ServerAddresses 192.168.13.4, 192.168.100.4
Чтобы завершить интерактивную сессию удаленного управления, нужно выполнить команду Exit-PSSession или exit. Строка-приглашение PS примет свой обычный вид, и вы вернетесь к своей локальной PowerShell консоли:
В Windows Server 2016/2019 PowerShell Remoting включен по умолчанию (это видно в консоли Server Manager -> Local Server -> Remote Management = Enabled).
В десктопных версиях Windows (Win10, Win11) PSRemoting и служба WinRM отключены.
Вы можете проверить, включен ли PSremoting на текущем компьютере:
Get-PSSessionConfiguration
Данная команда также позволяет получить список пользователей и групп, которым разрешено подключаться через WinRM. Для использования PSRemoting учетная запись пользователя должна состоять в группе
Administrators
или
Remote Management Users
. Особенности удаленного использования WinRM без прав администратора описаны здесь.
Вы можете протестировать, можно ли подключится через PowerShell Remoting к вашему компьютеру локально:
Test-WSMan -ComputerName localhost
Если команда вернет версию схемы WSMan, значит удаленные подключения к этому компьютеру через PS Remoting разрешены.
Если PowerShell Remoting отключен или не настроен, появился ошибка:
Test-WSMan : <f:WSManFaultxmlns:f="http://schemas.microsoft.com/wbem/wsman/1/wsmanfault" Code="2150858770" Machine="srv02"><f:Message>The client cannot connect to the destination specified in the request. Verify that the service on the destination is running and is accepting requests. Consult the logs and documentation for the WS-Management service running on the destination, most commonly IIS or WinRM. If the destination is the WinRM service, run the following command on the destination to analyze and configure the WinRM service: "winrm quickconfig".
Чтобы включить PowerShell Remoting, выполните команду:
Enable-PSRemoting -Force
Данная команда:
- Включает службу WinRM и настраивает ее на автозапуск;
- Создает точку подключения на стандартном порту WinRM (TCP/5985 для HTTP трафика);
- Добавляет исключения в Windows Firewall для WS-Management (если вы настраиваете PSRemoting вручную, добавьте правило самостоятельно);
- Разрешает удаленные PowerShell сессии;
- Перезапускает службу WinRM.
Убедитесь, что служба WinRM запущена и настроена на автоматический запуск:
Get-Service WinRM | Select MachineName,Name,Status, StartType
Enable-PSRemoting -SkipNetworkProfileCheck -Force
В домене Active Directory проще всего настроить Windows Remote Management (PSRemoting) на серверах и компьютера централизованно с помощью групповой политики.
В новых версиях PowerShell(v6 и v7) поддерживается использование протокола Secure Shell (SSH) для подключения к удаленному компьютеру через PowerShell Remoting. На удаленном компьютере должен быть доступна точка подключения SSH (в Windows теперь есть встроенный SSH сервер). Вы можете запустить интерактивную сессию PSRemoting поверх SSH с помощью команды:
Enter-PSSession -HostName [email protected]
Или аутентифицироваться по SSH с помощью RSA ключа:
Enter-PSSession -HostName k[email protected]:22 -KeyFilePath c:\PS\your_rsa_key
Enter-PSSession можно использовать совместно с командой New-PSSession:
$s = New-PSSession -ComputerName hq-srv01.contoso.com
Enter-PSSession -Session $s
Enter-PSSession поддерживает несколько способов аутентификации. Вы можете задать нужный способ с помощью параметра
-Authentication
. Поддерживаются Basic, Digest, Kerberos, CredSSP, NegotiateWithImplicitCredential, Negotiate Challenge.
В примере выше мы показали пример интерактивного подключения Enter-PSSession между компьютерами в одном домене Windows (для подключения достаточно указать FQDN или короткое имя, используется Kerberos аутентфикация). Если попробовать подключиться к удаленному компьютеру по IP адресу или CNAME, аутентификация не пройдет:
Enter-PSSession : Connecting to remote server 192.168.13.5 failed with the following error message: The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated.
Для подключения к удаленному компьютеру по IP можно добавить этот хост в список доверенных (Trusted Hosts) или использовать SSL (более безопасно).
Чтобы добавить IP адрес в доверенные, выполните команду:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.13.5
Можно добавить в доверенные хосты по маске
Set-Item WSMan:\localhost\Client\TrustedHosts -Value *.winitpro.ru
Вывести список доверенных хостов:
Get-Item WSMan:\localhost\Client\TrustedHosts
Аналогично нужно добавить ваш хост в доверенные на удаленном компьютере.
Перезапустите службу:
Restart-Service WinRM
Чтобы подключиться к удаленному компьютеру по IP адресу, используйте такую команду:
Enter-PSSession -ComputerName 192.168.13.5 -Credential (Get-Credential -UserName contoso\kbuldogov)
Командлеты Enter-PSSession и New-PSSession создают постоянную сессию типа один к одному и используются в основном в интерактивных сценариях. Если вам нужно автоматизация, или есть задачи, которые нужно выполнить сразу на множестве удаленных компьютерах, используйте командлет Invoke-Command.
Я сомневаюсь. На моей памяти были какие-то команды, которые не могли выводить инфу в консоль через Enter-PSSession.
И выполнить команды от имени админа (UAC) или от имени СИСТЕМА тоже не получится.
Если у Вас есть варианты решения, было бы здорово.
Так подключайтесь админом к удаленному ПК и делайте что нужно. Чем вам UAC не угодил в таком случае? Приведите пример что у вас не получается.
Для запуска от системы есть спец модули. Можно загуглить.
Всем хороша pssession, кроме вывода кракозябрами ipconfig /all на русской версии винды(например в сесии у пользователя)..благо есть всякие get-net*config’и..
Тема с разницей invoke-session, с пробросом модулей , установленных на целевом сервере вроде не раскрыта.
У меня вот такая функция полезная есть от крякозябр.
function ConvertTo-Encoding ([string]$From, [string]$To){
Begin{
$encFrom = [System.Text.Encoding]::GetEncoding($from)
$encTo = [System.Text.Encoding]::GetEncoding($to)
}
Process{
$bytes = $encTo.GetBytes($_)
$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
$encTo.GetString($bytes)
}
}
Invoke-Command -ScriptBlock { dism /? } -ComputerName testcomp | ConvertTo-Encoding -From cp866 -To windows-1251
Кто-нибудь занимается редакцией?
«Вы можете протестировать, можно ли подключится через включен ли PowerShell Remoting к вашему компьютеру локально:»
«в общей (piblic) сети»
» New-PSSession создают постоянную сессию типа один ко многим»
Что за бред? Как раз таки один к одному. А Invoke-Command один ко многим.
Можно было добавить про подключение к не доменным ПК или ПК из другого леса. При этом использовать сертификат для безопасности.
Еще интересна возможность использовать модули powershell, которые установлены на удаленных серверах, на локальном компьютере. Для примера — Import-Module -Name ActiveDirectory -PSSession $session01
Текст поправил.
Про сертфикаты наверно можно добавить. Но у меня в планах была статья при исопльзование winrm через HTTPS, про сертфикаты логично туда написать.
Импорт модулей с сервера штука удобная, но это про New-PSSession, а эта статья больше про интерактивное управление через Enter-PSSession. За идею спасибо, попробую рассказать про импорт и управление модулями PS в отдельной статье. 🙂
Удаленное управление PowerShell Remoting через WinRM HTTPS
https://winitpro.ru/index.php/2021/08/04/winrm-powershell-remoting-cherez-https/
Одно важное уточнение. Если планируетсся открывать новую сессию из существующей сесси это не прокатит. То есть если подключится через сессию и запустить скрипт который допустим чтото делает на других хостах через invoke-command, то это не прокатит, дальнейшие подключения блокируются
добрый день.
при попытке открыть удаленную сессию командой
enter-pssession -computername comp1
выдает ошибку
enter-pssession : Сбой подключения к удаленному серверу olimp. Сообщение об ошибке: Клиенту WinRM не удалось обработать запрос, так как не удалось разрешить имя сервера. Подробности см. в разделе справки «about_Remote_Troubleshooting».
строка:1 знак:1
+ enter-pssession -computername comp1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (olimp:String) [Enter-PSSession], PSRemotingTransportException
+ FullyQualifiedErrorId : CreateRemoteRunspaceFailed
на первый взгляд похоже что не отрабатывает разрешение имени через dns, но при проверке все пингуется и резолвится в обе стороны, тест соединения положительный «TcpTestSucceeded : True», с фаерволами все ок, права доменного админа.
пробовал на все компьютеры, результат одинаковый везде, включая контроллер домена.
enter-pssession : Сбой подключения к удаленному серверу olimp.
читать как
enter-pssession : Сбой подключения к удаленному серверу comp1.
недоредактировал)
Посмотрите, не задан ли HTTP прокси:
netsh winhttp reset proxy
Посмотрите, что PowerShell корректно резолвит имя:
[System.Net.Dns]::GetHostEntry("comp1")
Огромнейшее спасибо!! Reset proxy помогло. Ни за бы не догадался что в этом дело, что пытается через прокси.