logo

Для подключения к удалённым компьютерам для выполнения команд PowerShell в Windows есть специальная служба WinRM (Windows Remote Management). WinRM работает через протокол WS-Management.

Чтобы узнать стастус службы WinRM (включена/выключена):

Get-Service -Name "*WinRM*" | fl

Если служба WinRM не запущена, то запустить её можно командой (на удалённом компьютере):

Enable-PSRemoting

Для проверки подключения к удалённому компьютеру можно выполнить команду (командлет):

Test-WSMan имя/ip-адрес_компьютера

При проблемах с подключением из-за SSL-сертификата необходимо добавить подключаемый компьютер в список доверенных:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value ip-адрес_компьютера

Чтобы посмотреть список доверенных хостов можно выполнить:

Get-Item WSMan:\localhost\Client\TrustedHosts

Для принятия изменений необходимо перезагрузить службу WinRM:

Restart-Service WinRM

Сейчас рассмотрим непосредственное выполнение командлетов на удалённом компьютере. Для этого в PowerShell есть два компандлета: Enter-PSSession и Invoke-Command.

Enter-PSSession устанавливает сессию с удалённым компьютером и последующие комадлеты выполняются уже на нём. При подключении необходимо указать учётную запись, имеющую административные права на удалённом компьютере через -Credential. Например, можно указать учётную запись Администратора домена:

Enter-PSSession ip-адрес_компьютера -Credential ДОМЕН\учётная_запись

Invoke-Command позволяет выполнить сразу блок команд на удалённом компьютере. Данный блок отделяется фигурными скобками ("{" в начале и "}" в конце), а также может иметь множество строк, объединённых с помощью "@(...)". Например:

Invoke-Command -ComputerName ip-адрес_компьютера -ScriptBlock {@(
    $org = "CN=Users,DC=DOMAIN,DC=LOCAL"
    $username = Read-Host "Введите имя"
    $password = Read-Host "Введите пароль"
    $descr = "Пользователь"
    New-AdUser -Name $username -UserPrincipalName $username"@DOMAIN.LOCAL" -Path $org -GivenName $username -DisplayName $username -Description $descr -Enabled $true -CannotChangePassword $true -PasswordNeverExpires $true -AccountPassword (ConvertTo-SecureString $password -AsPlainText -force) -passThru;
)} -Credential ДОМЕН\учётная_запись

В принципе, на этом всё!