Командлет 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 [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
А мне только это.
1)#Enter-PSSession -ComputerName DNS.contoso.com
2)#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)
}
}
3)#ipconfig | ConvertTo-Encoding cp866 windows-1251
И вводить данную конструкцию (| ConvertTo-Encoding cp866 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 помогло. Ни за бы не догадался что в этом дело, что пытается через прокси.
Добрый день!
$servers содержит список hostname-ов, когда их было до 20 то
New-PSSession -ComputerName $servers -ThrottleLimit 70 работало, но если больше 20(а именно 50) то выдаёт ошибку:
— Указаны неверные имя пользователя или пароль.
— Используется проверка подлинности Kerberos без указания способа проверки подлинности и имени пользователя и т.д. и т.п.
В Get-PSSession тоже ничего нет.Но если уберу половину компов(до 20), то как уже говорил, всё почему-то работает.
В чём может быть причина ?
По умолчанию для New-PSSession лимит подключений -ThrottleLimit равент 32.
Так что -ThrottleLimit 70 должно увеличить количество сессий.
У вас какая версия PowerShell?
В файле имена компов не дублируются?
Версия 5.1 всё уже много раз перепроверял, с 19 компами всё работает, добавляю ещё один и всё перестаёт работать, нигде не нашёл схожей проблемы. $servers=@(get-content D:\laptops.txt)
Может это быть как-то связано с рабочими группами ?
Вожмно все таки проблемы с самими компьютерами в списке. Что-то не настроено, конфигурация отличается…
Правильно ли я понимаю что все компьютеры в списке в рабочей группе, и вы не смешиваете доменные и недоменные машины.
Попробуйте разбить список на 2-3 группы и проверить работу New-PSSession для каждой из них.
Да, все компы в рабочих группах, они разбиты по 1.txt, 2.txt и т.д. В каждом файле до 20 компов. Отдельно New-PSSession устанавливает соединение с каждым из этих файлов. Получается что всё работает ок, но когда я делаю cat 1.txt ,2.txt>3.txt и пытаюсь сделать$servers=@(get-content 3.txt); New-PSSession -ComputerName $servers -Credential $Cred
Не знаю в чем причина, но есть подозрение на число 20. Я насколько помню это как раз лимит на количество одновременных подключений в десктопных версиях Windows. Может быть в этом причина?
Можете проверить аналогичный скрипт с Windows Server, будут ли на нем такие же ограничения.
Вот по поводу лимита, я как раз инфррмацию нигде не нашёл(
С Windows Server попробую проделать это.
Проделал на Windows Server 2008R2, всё тоже самое: как только число машин больше 20, выдаёт ошибку, такую же как и на десктопной винде:
[laptop-60608] Не удалось подключиться к удаленному серверу. Сообщение об ошибке: WinRM не удается обработать запрос. При использовании проверки подлинности Negotiate возникла ошибка: Указанный сеанс работы не существует. Возможно, он уже завершен.
Возможные причины:
— Указаны неверные имя пользователя или пароль.
— При отсутствии заданного метода проверки подлинности и имени пользователя используется проверка подлинности Kerberos.
— Kerberos принимает имена пользователей домена, но не принимает имена локальных пользователей.
— Имя участника-службы для имени и порта удаленного компьютера не существует.
— Компьютер клиента и удаленный компьютер находятся в разных доменах, между которыми отсутствует доверительное отношение.
Получается, что нет возможности подлкючиться через New-PSSession к компьютерам находящимся в рабочей группе, если их число больше 20, используя один список, а не разбивать его на отдельные текстовые файлы по 19 машин в каждом?
Есть вопрос касательно PS-Remoting. Сессия с удаленным компьютером поднимается, команды исполняются. Но — в сессии сетевые ресурсы по UNC недоступны. то есть не получится например через Invoke-Command скопировать файл с сетевого ресурса на диск локального ПК. Set-Location на UNC адрес тоже не работает. На тоже самой машине в локальной консоли и UNC адрес, и Set-Location работают.
Это связано с ограничениями в PowerShell remoting на double-hop.
Т.е. при использовании Invoke-Command ваши учетные данные не отправляются на удаленную машину (в целях безопасности), а для аутентфикации используется kerberos.
Затем вы пытаетесь выполнить аутентфикацию уже с удаленного компьютера на другой удаленной сетевой папке (шаре).В этом случае ваши учётные данные не передаются дальше, чтобы предотвратить их перехват. Это и приводит к тому, что в удалённой сессии недоступны сетевые ресурсы (UNC-пути).
Для обхода такого ограничения можно настроить делегирования Kerberos (Constrained Delegation) или разрешить использовать CredSSP (менее безопасно):
Invoke-Command -ComputerName PC111 -Authentication CredSSP -Credential (Get-Credential) -ScriptBlock {..}
Добрый день!
Enter-PSSession работает только в локальной сети?
У меня есть другая подсеть с которой связь работает без проблем, но подлкючиться не могу, хотя раньшье когда комп был в локалке, там было всё настроено и без проблем подключался по Enter-PSSession,
Сообщение об ошибке: WinRM не удается выполнить операцию Убедитесь, что имя компьютера указано правильно, компьютер доступен по сети, а в брандмауэре задано исключение для службы WinRM, которое разрешает доступ к этому компьютеру.
Общий домен?
между подсетями есть файерволы?
Домен общий, да, микротик стоит.