Команды Poweshell можно запускать на удалённом компьютере по сети. Для удалённого запуска команд должен быть настроен доступ и открыт порт в брандмауэре. Существуют несколько особенностей при удаленном доступе. Рассмотрим некоторые из них.
Note: в этом блоге уже рассматривался удалённый доступ Powershell подробности по сслыке.
Включение удалённого доступа (Powershell Remote)
- Предварительные требования
- Запущена служба WinRM
- Открыт порт 5985 (HTTP), 5986 (HTTPS) в межсетевом экране
- Чтобы включить удалённый доступ запустите команду
Enable-PSRemoting
ИЛИ
winrm quickconfig
- Проверка статуса службы удалённого доступа
Test-WSMan
winrm get winrm/config/listener
Вывод команды:
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = X.X.X.X
Проверка прослушивания портаnetstat -ano | findstr :5985
0.0.0.0:5985
Если последняя команда выдаёт, что порт привязан к 127.0.0.1 (loopback), то удалённый доступ работать не будет. Нужно привязать порт ко всем IP адресам (0.0.0.0):
netsh http show iplisten
netsh http delete iplisten 127.0.0.1
netsh http add iplisten ipaddress=0.0.0.0
Note: PsExec
Для того чтобы включить удалённый доступ PowerShell нужно запустить команду Enable-PSRemoting на локальном компьютере. Можно ли включить PowerShell Remote на удалённом компьютере? Да! Если есть доступ администратора и открыты TCP-порты 135 и 445. Для этого можно использовать утилиту Sysinternals PsExec.
Для этого будет необходимо скачать PsExec на компьютер, с которого будет осуществляться подключение. На удалённом компьютере никаких программ устанавливать не нужно.
В общем виде работа PsExec выглядит следующим образом:
- Подключение к скрытой общей папке ADMIN$ (относящейся к папке C:\Windows) на удалённом компьютере через SMB
- Через менеджер сервисов Service Control Manager (SCM) запускается PsExecsvcservice и включается именованный канал (named pipe) на удалённой компьютере
- Ввод вывод консоли перенаправляется через созданный именованный канал
Подключиться к удалённому компьютеру и включить Powershell Remote
psexec.exe \\<computername> powershell.exe -command "& {Enable-PSRemoting -Force}"
Удалённое подключение Powershell (Remote Powershell)
По умолчанию удалённый доступ разрешён пользователям из группы локальных Администраторов на удалённом компьютере.
Если не использовать параметр Credentials, то подключение происходит под пользователем, запустившим команду.
- Запуск интерактивной сессии на удалённому компьютере
Enter-PSSession Server01
ИЛИ
winrs -r:Server1 dir
- Завершить удалённую сессию
Exit-PSSession
- Запуск комманды на нескольких удалённых компьютерах
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-UICulture}
- Запуск команд из скрипта на нескольких удалённых компьютерах
Invoke-Command -ComputerName Server01, Server02 -FilePath c:\Scripts\DiskCollect.ps1
- Создать постоянную (persistent) сессию на удалённом компьютере
$s = New-PSSession -ComputerName Server01, Server02
Invoke-Command -Session $s {$h = Get-HotFix}
Invoke-Command -Session $s {$h | where {$_.InstalledBy -ne "NT AUTHORITY\SYSTEM"}} - Удалённый доступ на Workgroup компьютер или по IP адресу
Если удалённый компьютер находиться не в домене (см. domain trust) или доступ осуществляется по IP адресу, то аутентификация может завершиться ошибкой. Соединение не установится.
Для того, чтобы подключиться к такому компьютеру, нужно на локальном компьютере добавить его адрес в список доверенных компьютеров (trusted hosts). Проще всего добавить все возможные адреса, чтобы разрешить клиенту подключаться к любым удалённым компьютерамSet-Item WSMan:\localhost\Client\TrustedHosts -Value *
Это команду надо запустить на компьютере, с которого осуществляется подключение. Однако этого может оказаться не достаточно, чтобы запустить команду на компьютере в рабочей группе.
- Когда TrustedHost не работает, даже если пользователь в группе локальных Администраторов
Если вы запускаете команду требующую повышения прав (elevated session), то это не сработает, если удалённый компьютер в рабочей группе. Т.е. если вы подключились под локальным пользователем (даже если он в группе администраторов), он все равно получает права обычного пользователя. Чтобы проверить является ли сессия на удалённом компьютере с полными правами (вернёт $true) или с правами обычного пользователя (вернёт $false) нужно запустить команду:[Security.Principal.WindowsPrincipal]::new([Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
Ещё один способ проверить, если сессия с правами администратора или обычного пользователя
[bool] (net session 2>$null)
Почему сессия получает ограниченные права, даже если пользователь в группе администраторы? Это происходит потому что срабатывает политика фильтрации UAC (подробнее смотри статью по сслыке). Для того чтобы локальный пользователь в группе администраторов получал привилегированную сессию при удалённом подключении Powershell нужно включить ключ реестра LocalAccountTokenFilterPolicy. Этот ключ потребуется для компьютеров в рабочей группе, поскольку для доменных компьютеров можно исопльзовать доменную учётную запись, находящуюся в группе Администраторов.
Set-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1
Это команду надо запустить на компьютере, к которому осуществляется подключение.
Ключ реестраHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy = 1
позволяет локальным аккаунтам из группы администраторы подключаться к сервису WinRM.https://helpcenter.gsx.com/hc/en-us/articles/202447926-How-to-Configure-Windows-Remote-PowerShell-Access-for-Non-Privileged-User-Accounts
https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0657528
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_remote_troubleshooting?view=powershell-7.1
https://docs.microsoft.com/en-us/windows/win32/winrm/authentication-for-remote-connections
https://stackoverflow.com/a/40266799
https://stackoverflow.com/a/65024701
- Когда TrustedHost не работает, даже если пользователь в группе локальных Администраторов