Удаленный запуск скриптов windows

В наше время даже для собак придумали удаленное управление.

Возвращаясь к циклу «Конспект Админа», мне хотелось бы рассказать о вариантах запуска исполняемых программ на удаленных компьютерах. Эта статья будет интересна тем, у кого еще нет систем централизованного управления, но уже есть понимание утомительности ручного обхода рабочих станций и серверов. Либо тем, кому решения «под ключ» не интересны ввиду неспортивности.

В качестве того, зачем нужен такой запуск программ, можно привести недавнюю истерию с Петей\Не-Петей, когда все бросились проверять\отключать SMBv1 и загружать обновления. Да и провести инвентаризацию или установить срочный патч таким методом тоже можно.

Когда-то давно я устроился работать в организацию в период эпидемии Kido\Conficker. Наиболее простым способом выяснить, все ли хорошо в ИС компании, была славная утилита от Касперского под названием Kido Killer, которая проверяла наличие вируса и устраняла его. Запускать программу на доброй сотне машин руками было невесело, поэтому пришлось знакомиться с автоматизацией.

Если в операционных системах *nix для удаленного запуска, как правило, используется SSH, то у Windows способов запуска программ и скриптов воистину как песка в пустыне. Я разберу основные варианты, как общеизвестные, так и экзотические. Таких очевидных вещей как telnet-сервер касаться не буду, тем более Microsoft уже убрала его из современных ОС.

Способы старые, временем проверенные

Psexec

Пожалуй, это первое, что приходит на ум, когда идет речь об удаленном запуске программ. Утилита от Марка Руссиновича используется еще со времен Windows NT и до сих пор применяется. Помимо основной функции, можно использовать ее и как Runas, и для запуска программ в пользовательской сессии терминального сервера. Psexec также позволяет задавать ядра процессора, на которых будет запускаться программа, и ее приоритет в системе.

В качестве примера посмотрим, установлено ли обновление, закрывающее нашумевшую уязвимость SMB на списке компьютеров:

psexec @computers.txt /u USER /p PASS cmd.exe /v /c ""systeminfo | find "KB4012212" || echo !computername! >> \\server\share\log.txt"""

В файле computers.txt находится список компьютеров. Для запуска по всему домену можно использовать \\*. В файле \\server\share\log.txt будут появляться имена рабочих станций или серверов без обновления. Если в домене существуют компьютеры с *nix на борту или нет доступа к административному сетевому ресурсу Admin$ ― команда на этой машине не выполнится, но обработка продолжится. Чтобы скрипт не зависал при каждой попытке подключения, можно задать тайм-аут с помощью ключа -n.

Если компьютер выключен ― мы об этом не узнаем. Поэтому лучше предварительно проверять доступность машин или собирать в файле информацию об успешном или неудачном выполнении.

К минусам Psexec можно отнести то, что она из-за своего удобства и популярности часто используется вирусописателями. Поэтому антивирусные системы могут обнаруживать утилиту как опасность вида remote admin.

По умолчанию процесс на удаленной машине выполняется от имени пользователя, запустившего Psexec. При необходимости логин и пароль можно задать явно или же использовать аккаунт SYSTEM.

WMIC

Для управления системами Windows с помощью разных графических утилит часто используется WMI (Windows Management Instrumentation) ― реализация объектно-ориентированного стандарта управления WBEM. В качестве утилиты с графическим интерфейсом для работы с WMI можно использовать wbemtest.exe.

Для работы с WMI из консоли создана wmic.exe. Например, для проверки установленных обновлений вместо жутковатой конструкции из предыдущего примера можно использовать простую команду:

wmic /node:"servername" qfe get hotfixid | find "KB4012212"

Использовать список компьютеров также можно командой /node:»@computers.txt».

Еще при помощи WMI можно запускать программы – синтаксис предельно прост:

wmic /node:"servername" process call create "cmd /c somecommands"

К сожалению, в отличие от Psexec, получить вывод в консоли не получится ― придется выводить результаты команды в файл.

По умолчанию процесс на удаленной машине выполняется от имени пользователя, запустившего wmic. При необходимости логин и пароль можно задать явно.

Групповые политики и скрипты

Если предыдущие варианты не требовали доменной среды, то в этом случае потребуется домен. Поддерживаются скрипты при входе и выходе пользователя из системы, а также при ее включении и выключении. Поскольку каждый администратор Windows сталкивался с ними, я не буду подробно расписывать как ими пользоваться ― лишь напомню, где их искать.

Скрипты, выполняющиеся при старте и завершении системы.

Скрипты, выполняющиеся при входе и выходе пользователя из системы.

Скрипты, настраиваемые в пользовательском разделе, выполняются от имени пользователя, а в разделе компьютера ― под аккаунтом SYSTEM.

Назначенные задания

Довольно интересный способ, заслуживающий право на жизнь. Назначенные задания можно создавать из командной строки при помощи утилиты schtasks.exe, выполнять их, затем удалять. Подробнее с синтаксисом можно ознакомиться в документации, я же разберу пример использования назначенных заданий в доменной среде. Предположим, нам нужно выполнить команду как можно быстрее вне зависимости от того, выключен компьютер или нет. Для этого используются так называемые предпочтения групповых политик (Group Policy Preference).

Искать установку назначенных заданий следует в конфигурации компьютера или пользователя ― «Настройка ― Параметры панели управления ― Назначенные задания».

Создание нового назначенного задания.

Для выполнения команды или скрипта ASAP понадобится создать «Немедленную задачу (Windows 7 и выше)». Если вдруг в инфраструктуре остались машины под управлением Windows XP, то подойдет «Очередное задание (Windows XP)».

Стоит сделать несколько политик с соответствующими WMI-фильтрами или создать два разных назначенных задания в одной политике с нацеливанием ― например, при помощи того же WMI-фильтра. Это поможет избежать конфликтов в разнородной среде со старыми и новыми Windows.

Пример WMI-фильтра для применения политики только на компьютерах с Windows XP:

SELECT * FROM Win32_OperatingSystem WHERE Version LIKE "5.1%" AND ProductType = "1"

В остальном процедура создания назначенного задания тривиальна. Единственное, не забывайте отметить пункт «Применить один раз и не применять повторно», если задача не требует повторного запуска.

Запускаем немедленную задачу только один раз.

При использовании таких назначенных заданий программа запустится, как только компьютер получит обновление групповой политики. Это удобно: не нужно проверять доступность компьютеров в случае Psexec и wmic и заставлять пользователей перезагружать машины, как в случае скриптов групповых политик. При необходимости можно скопировать файл скрипта локально в разделе «Настройка ― Конфигурация Windows ― Файлы».

Назначенные задания позволяют явно задать имя пользователя для запуска программы, в том числе и для SYSTEM.

Через реестр

Модификация реестра на пользовательских машинах ― странный вариант, лишь на случай крайней необходимости. Можно использовать ветки Run или RunOnce. Подробнее о них ― в документации. Сама модификация реестра может проводиться через групповые политики или из командной строки ― например, такой командой:

reg add \\COMPUTER\HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce /v script /t Reg_SZ /d "script.cmd"

В зависимости от ветки реестра, процесс будет выполняться или под пользователем, выполнившим вход в систему, или под аккаунтом SYSTEM.

Есть и другие способы, такие как правка ярлыков в папке «Автозагрузка» или добавление в ярлык к популярной программе && script.cmd, но эти методы уже из серии «можно, но не нужно».

Теперь перейдем к новым инструментам.

Способы новые или куда же без PowerShell

PowerShell, оправдывая свое название, может подключаться к удаленным компьютерам при помощи WMI, RPC и WS-Management (WSMan). Использование последнего метода требует предварительной настройки.

Командлеты, не требующие предварительной настройки, как правило, имеют параметр ComputerName, но не имеют параметра Session. Посмотреть список таких командлетов можно командой:

Get-Command | where { $_.parameters.keys -contains "ComputerName" -and $_.parameters.keys -notcontains "Session"}

Для настройки WSMan в общем случае достаточно выполнить команду Enable-PSRemoting-Force. Она запустит службу удаленного управления WinRM и пропишет исключения в фаерволе ― в принципе, это можно сделать для всего домена при помощи групповых политик. Подробнее настройка описана в документации.

После того как все компьютеры будут готовы принимать запросы, мы сможем подключаться при помощи соответствующих командлетов PowerShell. Для проверки возможности подключения используется командлет Test-WSMan.

Проверка возможности подключения.

Для того чтобы выполнить определенную команду или скрипт, используется командлет Invoke-Command со следующим синтаксисом:

Invoke-Command -ComputerName COMPUTER -ScriptBlock { COMMAND } -credential USERNAME

Где COMPUTER ― имя компьютера, COMMAND ―– имя команды, а USERNAME ― имя пользователя, если оно нужно.

Смотрим содержимое диска С удаленного компьютера.

Если же нам нужно получить полноценную консоль ― не автоматизации ради, а ради управления конкретным компьютером, ― то можно использовать командлет Enter-PSSession.

Работаем в консоли удаленного компьютера.

Напомню, что с помощью JEA можно ограничить доступные подобной сессии командлеты или дать доступ нужным без прав администратора.

Конечно, кроме встроенных средств и небольших утилит, существует множество программ для управления структурой. Помимо взрослых решений, для управления конфигурациями вроде Chef, Ansible и MS SCCM можно использовать и средства мониторинга вроде Zabbix, и даже консоль управления антивирусом Касперского.

В период гетерогенных структур хорошо бы иметь возможность унифицированного управления Windows и Linux. Это можно сделать и с помощью PowerShell, что само по себе достойно отдельной статьи ― стоит такую сделать или уже лишнее?

Кстати, поделитесь вашими способами скрытого и не очень запуска программ на удаленных компьютерах. Ну, за исключением эксплойтов.

Для удаленного запуска команд или PowerShell скриптов на одном или нескольких удаленных компьютерах можно использовать командлет Invoke-Command.

Содержание:

  • Настройка WinRM для PowerShell Remoting
  • Выполнение удаленных команд через Invoke-Command
  • Invoke-Command: одновременный запуск команд на нескольких компьютерах
  • Постоянные сессии в PowerShell Remoting

Настройка WinRM для PowerShell Remoting

Для установки связи с удаленным компьютерами командлет Invoke-Command использует сессии PowerShell Remoting. Технология удаленного управления и запуска команд PowerShell Remoting основана на протоколе WS-Management (реализуется через службу WinRM, Windows Remote Management). Для связи с удаленным компьютерами используются протокол HTTP (порт
TCP/5985
) или HTTPS (порт
TCP/5986
). По умолчанию используется протокол HTTP, но даже этот трафик шифруется с помощью ключа AES-256 (впрочем, есть угроза атак man-in-the middle). Возможна аутентификация через Kerberos (в домене) или NTLM.

Чтобы установить сессию (PSSession) с удаленным компьютерам, на нем нужно включить службу WinRM и разрешить удаленные подключения:

Проверьте, что на клиенте запущена служба WinRM и слушатель службы (WinRM listener):

Get-Service -Name "*WinRM*" | fl
WinRM enumerate winrm/config/listener

WinRM enumerate: проверить листенер

В данном случае служба WinRM не настроена. Чтобы включить ее и разрешить удаленные подключения через WinRM, выполните команду:

winrm quickconfig

или

Enable-PSRemoting -Force

WinRM has been updated to receive requests. WinRM service started.  

WinRM is already set up for remote management on this computer.

Enable-PSRemoting включить и настроить winrm в Windows

Эта команда запустит службу WinRM (установит автоматический запуск), задаст настройки winrm по-умолчанию и добавит исключения в Windows Firewall.

Теперь проверьте возможно ли удаленное подключение к компьютеру через PSRemoting:

Test-WsMan compname1

Test-WsMan - проверить работу winrm на удаленном компьютере

По умолчанию WinRM не будет работать для сетевых подключений, которые определяются как общедоступные (Public). Рекомендуется изменить тип сети в Windows на частную (private) или доменную. Если это невозможно, можно разрешить WinRM для общедоступных сетей и включить соответствующее правило брандмауэра:
Enable-PSRemoting -SkipNetworkProfileCheck
Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any

Если компьютеры не в домене (используется рабочая группа), или вы обращаетесь к компьютерам через по IP адресам, в этом случае для аутентификации вместо Kerberos использоваться протокол NTLM. Чтобы разрешить NTLM аутентификацию через WimRM, нужно на компьютере (с которого вы будете устанавливать подключения) добавить имя/IP удаленного хоста в доверенные:
Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201

Либо можно разрешить подключение ко все компьютерам (не рекомендуется, т.к. один из главных недостатков NTLM – он не осуществляет проверку подлинности)
Set-Item wsman:\localhost\Client\TrustedHosts -value *

Аналогичные настройки нужно сделать на удаленных хостах.
Чтобы вывести список доверенных хостов, выполните команду:
Get-Item WSMan:\localhost\Client\TrustedHosts

Чтобы применить изменения, перезапустите службу WinRM:

Restart-Service WinRM

Set-Item wsman:\localhost\Client\TrustedHosts

Выполнение удаленных команд через Invoke-Command

Чтобы выполнить одну команду на удаленном компьютере, нужно указать имя компьютера (
-ComputerName
) и саму команду в блоке
{ScriptBlock}
:

Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}

Командлет отправит указанную команду на удаленный компьютер и выведет результат в консоль (результат возвращается в виде объекта PowerShell). В данном случае мы проверили состояние службы Windows Update на удаленном компьютере.

Invoke-Command удаленно запустить команду

Чтобы прервать удаленный запуск команды через Invoke-Command, нажмите в консоли
CTRL+C
.

Командлет Invoke-Command выполняет команды от имени пользователя, под которым запущена консоль PowerShell. Чтобы выполнить команду от другого пользователя, используется параметр
-Credential
:

$cred = Get-Credential
Invoke-Command -ComputerName comp-buh2 -Credential $cred -ScriptBlock {Get-NetAdapter}

Эта PowerShell команда выведет список сетевых интерфейсов на удаленном компьютере:

  • Право на удаленное подключение через PSRemoting есть у членов группы локальных администраторов и Remote Management Users.
  • Если в отправляемой на удаленный компьютер команде есть обращение к удаленному ресурсу (например папке сетевой папке), при аутентфикации на втором ресурсе произойдёт ошибка. Эта проблема называется double hop (двойной прыжок) и связана с ограничениями безопасности Windows, запрещающими передачу учетных данных на третий ресурс.

Если на компьютере нужно выполнить несколько последовательных команд, их нужно разделить точкой с запятой в блоке ScriptBlock. Следующая команда выведет текущий часовой пояс и изменит его на другой:

Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Astrakhan Standard Time"}

Invoke-Command несколько команд в блоке ScriptBlock

Командлет Invoke-Command позволяет запускать не только отдельные команды, но и скрипты PowerShell. Для этого нужно указать путь к локальному PS1 файлу со скриптом в параметре
-FilePath
:

Invoke-Command -ComputerName Server01 -FilePath c:\PS\Scripts\GetComputerInfo.ps1

  • При таком способе закуска не нужно вручную копировать ваш PowerShell скрипт на удаленные компьютеры
  • Настройки политики выполнения скриптов PowerShell игнорируются

Если нужно передать значение локальной переменной из скрипта в блок команд Invoke-Command, используется конструкцию
$using
:

$localVar = Get-Date
Invoke-Command -ComputerName Server01 -ScriptBlock {
"Date = $using:localVar"
}

Invoke-Command: одновременный запуск команд на нескольких компьютерах

Командлет Invoke-Command позволяет выполнить вашу команду одновременно (параллельного) на нескольких удаленных компьютерах. В самом просто случае имена компьютеров, на которых нужно выполнить команды указываются через запятую:

Invoke-Command server1, server2, server3 -ScriptBlock {get-date}

Invoke-Command параллельный запуск команд на нескольких компьютрах

Список компьютеров можно поместить в переменную (массив):

$servers = @("server1","server2","server3")
Invoke-Command -ScriptBlock { get-date} -ComputerName $servers

Или получить из текстового файла:

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)

Также можно получить список компьютеров в ADс помощью командлета Get-ADComputer из модуля AD PowerShell. Например, чтобы выполнить команду на всех Windows Server в домене, используйте такой код:

$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {get-date} -ErrorAction SilentlyContinue

Если компьютер выключен, или недоступен, благодаря параметру SilentlyContinue скрипт не будет остановлен и продолжит выполнение на других компьютерах.

Чтобы понять с какого компьютера получены результаты, нужно использовать специальную переменную окружения PSComputerName.

$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime

Invoke-Command вернуть результы с каждого компьютера через PSComputerName

В Invoke-Command есть ограничение на максимальное количество одновременных сессий с компьютерами. По умолчанию она равно 32 (определяется параметром ThrottleLimit. Если вам нужно выполнить команду одновременно более чем на 32 компьютерах (например, на 128), используйте параметр
–ThrottleLimit 128
.

Для запуска команд на удаленных компьютерах через Invoke-Command в фоновом режиме используется специальный атрибут
–AsJob
. В этом случае результат выполнения команды не возвращается в консоль. Чтобы получить результаты нужно использовать командлет
Receive-Job
.

Для интерактивного запуска команды на удаленном компьютере, используйте командлет Enter-PSSession.

Постоянные сессии в PowerShell Remoting

Если вам часто нужно выполнять команды на удаленном компьютер, можно создать постоянную PSRemoting сессию с удаленным компьютером. В этом случае командлету Invoke-Command не нужно будет каждый раз инициировать удаленное подключение.

Создадим постоянную (persistent) сессию с удаленным одним или несколькими компьютерами:

$s = New-PSSession -ComputerName Server01, Server02

Теперь, чтобы выполнить команду в созданном сеансе PSSession, используйте параметр -Session:

Invoke-Command -Session $s -ScriptBlock { Get-ComputerInfo|select OsLastBootUpTime }

запуск invoke-command в persistent powershell pssession

Чтобы закрыть удаленную сессию, нужно закрыть консоль PowerShell или выполнить:

Remove-PSSession $s

If you need to run commands or scripts against one or more remote computers, you can use PowerShell Remoting. In this article, we will look at several examples of how to use PowerShell Remoting interactive session mode and persistent connections to run PS1 a script on a remote computer.

Configuring WinRM for Remote PowerShell Connections

To connect to a remote computer using a PowerShell session, WinRM (Windows Remote Management Service) must be enabled and configured. WinRM is disabled by default in Windows 10 and 11 desktop versions.

The following command allows you to quickly enable and configure WinRM on the computer:

Enable-PSRemoting

Note. You should use the following command to enable WinRM on Windows computers with the Public network connection profile:

Enable-PSRemoting –SkipNetworkProfileCheck -Force

Check that the WinRM service is running by using the Get-Service command:

Get-Service WinRM

execute powershell script on remote computer

Check that the Windows Defender rule that allows remote connection via WinRM is enabled (by default HTTP port 5985 is used for connection):

Get-NetFirewallRule -Name "WINRM-HTTP-In-TCP-NoScope"|select name, Enabled

how to run powershell script on remote computer

Workgroup computers should have another Windows Firewall rule enabled that allows inbound WinRM traffic:

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any -Enabled true

Now you test the WinRM connectivity to target computer using the command:

Test-WSMan wks11

If you get a reply, then the remote computer can be accessed using PowerShell Remoting.

Hint. If you use an IP address (instead of a name) to connect to a remote computer via PS Remoting, you may get an error:

Connecting to remote server 192.168.1.70 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.

In this case, you need to install an HTTPS certificate for PowerShell Remoting on the remote computer (the long way), or add this host to the trusted ones on your management computer:

Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.70

Then restart the WinRM service:

Restart-Service WinRM

Using PowerShell Remoting Interactive Mode to Run Remote Commands

You can run any command on a remote host in real time by using an interactive PowerShell remoting session. Specify a remote host name (wks11 in this example) in the Enter-PSSession command:

Enter-PSSession wks11

The PowerShell prompt will change. The name of the remote computer you are connected to now appears at the beginning of the command prompt. You can run any command that will be executed on the remote host and return the result back to your command prompt.

To end the remote interactive PowerShell session:

Exit-PSSession

powershell run script on remote computer

Only simple management tasks are typically performed on remote computers in interactive mode. To run a complex command or to run the PowerShell script file (PS1) remotely, use the Invoke-Command cmdlet.

Using Invoke-Command to Run PowerShell Scripts Remotely

The Invoke-Command cmdlet allows to connect to remote computer using PowerShell Remoting and run the block of commands specified in the ScriptBlock parameter:

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName wks11

To run multiple PowerShell commands from a ScriptBlock parameter, separate them with semicolons. The commands you specify will be executed sequentially, one after the other, on the remote computer:

Invoke-Command -ScriptBlock {Restart-Service spooler;Get-Date; wmic qfe list} -ComputerName wks11

execute powershell script remotely

PowerShell allows you to run local PS1 scripts on remote computers. Specify the full path to the PS1 script file in the -FilePath parameter. To run a local PowerShell script against three remote computers:

Invoke-Command -FilePath c:\ps\tune.ps1 -ComputerName server1,server2,server3

how to run powershell script remotely

Note that you do not need to manually copy the PS1 script file to the remote computers. PowerShell Remoting passes the script code to the remote session and runs it.

You can save the list of computers to a text file and run the PowerShell script remotely on all the computers at once.

Invoke-command -ComputerName (get-content c:\ps\servers.txt) -filepath c:\ps\tune.ps1

If you need to run PowerShell scripts with credentials other than the current user, get the user’s credentials and save them in a variable:

$cred = Get-Credential

Invoke-Command -FilePath c:\ps\tune.ps1 -ComputerName server1 -Credential $cred

remote execute powershell script

To pass local variables to a remote PowerShell session, use the $Using prefix:

$name=”script1.ps1”

Invoke-Command -ComputerName dc03 -Scriptblock{write-host $using:Name}

Using Persistent Remote PowerShell Connections (Sessions)

A new session is created with the remote computer each time you run Invoke-Command. This takes time and system resources. Use the New-PSSession cmdlet to create persistent PowerShell sessions with a remote computer.

For example, let’s create sessions with three computers and save them in the $PSSess variable:

$PSSess = New-PSSession -ComputerName server1, server2, server3

Once you have established a session, you can use it to run commands and scripts. For example, the following command will get a list of processes on remote computers and save them in the $RemoteProcesses variable:

Invoke-Command -Session $PSSess {$RemoteProcesses = Get-Process}

Now you can use this variable in other commands in the same sessions.

powershell run remote script

The persistent remote PowerShell session remains active until you close the PowerShell console or forcefully end the session by using the Disconnect-PSSession or Remove-PSSession cmdlets.

Hint. If you can’t enable and configure WinRM on the remote host, you can execute PowerShell commands against a remote computer using the PsExec tool. For example, run several PowerShell commands in sequence:

psexec.exe \\SrvNY01 powershell.exe -command "& {get-process;Get-Services; Get-CimInstance -ClassName Win32_OperatingSystem | Select LastBootUpTime

Or, remotely run a PS1 script file:

psexec -s \\SrvNY01 Powershell -ExecutionPolicy Bypass -File \\dc1\netlogon\scripts\Get-Info.ps1

As you can see, PowerShell provides a wide range of options for running scripts and commands on remote computers.

Cyril Kardashevsky

I enjoy technology and developing websites. Since 2012 I’m running a few of my own websites, and share useful content on gadgets, PC administration and website promotion.

PowerShell: используем Invoke-Command для запуска команд/скриптов на удаленных компьютерах

https://t.me/i_odmin

В этой статье мы рассмотрим особенности использования командлета Invoke-Command для удаленного выполнения команд и скриптов. Возможно запускать команды удаленно на одном компьютере, или параллельно на множестве компьютерах в вашей сети. Командлет Invoke-Command использует возможности удаленного управления, заложенные в PowerShell Remoting. PowerShell Remoting позволяет удаленно подключаться к PowerShell сессиям на компьютерах через службу WinRM (Windows Remote Management) через протокол Web Services for Management (WS-Management). Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.

Настройка WinRM для PowerShell Remoting

Для связи между компьютерами в PowerShell Remoting используется протокол HTTP (порт TCP/5985) или HTTPS (порт TCP/5986). По умолчанию используется протокол HTTP, но даже этот трафик шифруется с помощью ключа AES-256 (впрочем, есть угроза атак man-in-the middle). Возможна аутентификация через Kerberos (в домене) или NTLM.

На удаленных компьютерах, к которым вы планируете подключаться должен быть запущена служба WinRM. Проверить это можно так:

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

Если служба не запущена, запустите ее:

Enable-PSRemoting

WinRM has been updated to receive requests.
WinRM service started.
WinRM is already set up for remote management on this computer.

Enable-PSRemoting включить и настроить winrm в Windows

Данная команда запустит службу WinRM (установит автоматический запуск), выставит настройки winrm по-умолчанию и добавит исключение в Windows Firewall. Команда Enable-PSRemoting –Force включает WinRM без запроса пользователя.

Теперь к компьютеру можно подключиться удаленно через PowerShell Remoting.

Обратите внимание, что PowerShell Remoting по-умолчанию не работает, если тип вашей сети определен как общедоступная (Public). В этом случае команда вернет ошибку: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.

Вам нужно изменить тип сети на частную (private), или использовать команду:

Enable-PSRemoting –SkipNetworkProfileCheck.

Также нужно включить правило Window Defender Firewall, которое разрешает доступ к WinRM в общедоступных сетях. Вы можете включить правило брандмауэра с помощью GPO или PowerShell:

Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any

Чтобы проверить подключение к удаленному компьютер через PowerShell Remoting используется команда:

Test-WsMan compname1

Test-WsMan — проверить работу winrm на удаленном компьютере

Если у вас нет домена, или вы обращаетесь к компьютерам через PowerShell Remoting по IP адресам, в этом случае используется для аутентификации используется протокол NTLM. При использовании NTLM, при выполнении команду Invoke-Command появится ошибка:

[192.168.1.201] Connecting to remote server 192.168.1.201 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: thetransport 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. + FullyQualifiedErrorId : CannotUseIPAddress,PSSessionStateBroken

Invoke-Command Default authentication may be used with an IP address under the following conditions: thetransport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided

Для корректной работы NTLM аутентификации, на компьютере, с которого вы будете устанавливать подключения нужно выполнить дополнительные действия: выпустить SSL сертификат или добавить имя/IP адрес хоста в доверенные:

Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201

Set-Item wsman:\localhost\Client\TrustedHosts

Либо можно разрешить подключение ко все компьютерам (не рекомендуется, т.к. один из главных недостатков NTLM – он не осуществляет проверку подлинности).

Set-Item wsman:\localhost\Client\TrustedHosts -value *

Аналогичные настройки нужно сделать на удаленных хостах.

Чтобы вывести список доверенных хостов, выполните команду:

Get-Item WSMan:\localhost\Client\TrustedHosts

Чтобы применить изменения, перезапустите службу WinRM:

Restart-Service WinRM

Также вы можете включить и настроить WinRM с помощью групповых политик.

Удаленное выполнение PowerShell с помощью Invoke-Command

Командлет Invoke-Command позволяет выполнить команду на одном или нескольких удаленных компьютерах.

Например, для запуска одиночной команды на удаленном компьютере можно использовать такую команду:

Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}

Invoke-Command -ComputerName -ScriptBlock — запуск команд powershell на удаленном компьютере через winrm

Эта команда выведет в вашу консоль значение версии PowerShell, установленной на удаленном компьютере, имя которого указано в параметре -ComputerName. В блоке -ScriptBlock {[cmdlet]} указывается команда, которую нужно запусть на удаленном компьютере.

По-умолчанию команда, посланная через Invoke-Command выполняется на удалённом компьютере от текущего пользователя. Если нужно выполнить команду от имени другого пользователя, сначала нужно запросить учетные данные пользователя и сохранить их в переменную:

$cred = Get-Credential

Invoke-Command -ComputerName comp-buh2 -Credential $cred -ScriptBlock {Get-NetAdapter}

Эта PowerShell команда выведет список сетевых интерфейсов на удаленном компьютере:

Можно задать несколько команд в блоке ScriptBlock, их нужно разделить точкой с запятой. Например следующая команда выведет текущий часовой пояс и изменит его на другой:

Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Astrakhan Standard Time”}

Invoke-Command несколько команд в блоке ScriptBlock

Invoke-Command позволяет выполнять не только отдельные команды, но и запускать скрипты PowerShell. Для этого используется аргумент -FilePath (вместо –ScriptBlock). При этом вы указываете путь к локальному PS1 файлу скрипта на вашем компьютере (вам не нужно копировать файл скрипт на удаленный компьютер):

Invoke-Command -ComputerName Server01 -FilePath c:\PS\Scripts\GetComputerInfo.ps1

Используем Invoke-Command для параллельного запуска команд на нескольких компьютерах

Командлет Invoke-Command можно использовать для параллельного выполнения команд на нескольких удаленных компьютерах.

В самом просто случае имена компьютеров, на которых нужно выполнить команды указываются через запятую:

Invoke-Command server1, server2, server3 -ScriptBlock {get-date}

Invoke-Command параллельный запуск команд на нескольких компьютрах

Список компьютеров можно поместить в переменную (массив):

$servers = @(″server1″,″server2″,″server3″)

Invoke-Command -ScriptBlock { get-date} -ComputerName $servers

Или получить из текстового файла:

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)

Также можно получить список компьютеров в ADс помощью командлета Get-ADComputer из модуля AD PowerShell:

Чтобы выполнить команду на всех Windows Server в домене, исопльзуйте такой код:

$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"').Name

Invoke-Command -ComputerName $computers -ScriptBlock {get-date} -ErrorAction SilentlyContinue

Если компьютер выключен, или недоступен, благодаря параметру SilentlyContinue скрипт не будет остановлен и продолжит выполнение на других компьютерах.

Чтобы понять с какого компьютера получены результаты, нужно использовать специальную переменную окружения PSComputerName.

$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}

$results | Select-Object PSComputerName, DateTime

Invoke-Command вернуть результы с каждого компьютера через PSComputerName

При запуске команды через Invoke-Command на нескольких компьютерах она выполняется параллельно. В Invoke-Command есть ограничение на максимальное количество компьютеров, которыми можно управлять одновременно (ограничение на количество одновременных PSSession). Оно определяется параметром ThrottleLimit (по умолчанию 32). Если вам нужно выполнить команду одновременно более чем на 32 компьютерах (например, на 128), используйте параметр –ThrottleLimit 128 (но это вызывает повышенную нагрузку на ваш компьютер).

Для запуска команд на удаленных компьютерах через Invoke-Command в фоновом режиме используется специальный атрибут –AsJob. В этом случае результат выполнения команды не возвращается в консоль. Чтобы получить результаты нужно использовать командлет Receive-Job.

источник

Last Updated :
15 May, 2024

From the Command Line Interface on Windows, the Command Prompt Application first comes to your mind. However, another great Command Line Interface is Windows Terminal i.e. Windows Powershell which can be also useful.

If you want to perform Remote Command Execution on some other Remote Computers, then the Powershell on Windows will be used. This article will discuss the steps to Execute Remote Commands on Windows Powershell.

What is Remote Command Execution on Windows?

If you are on any local Windows OS & want to perform some actions on the Windows Powershell, the Execution of Remote Command will be the only option. The Remote Command Execution enables the method to access other Windows Powershell Applications from any single device with the help of the IP Address.

Once, you enter the Computer Name or IP Address of the Windows, those two computers will be associated only with Powershell. That means, the Powershell of two Windows Computers will be connected & from your device you can execute some commands on the Remote Device. Here, two entire Windows OS are not completely connected.

This practice can be useful for System Administrators who need to manage different computers at the same time across the network.

How to Enable Remote Command Execution on Powershell?

Note: By default, the Remote Command Execution on Windows Powershell is disabled. So, if you have to work on the concept, you have to Enable Powershell Remote Command Execution.

Step 1: Right-click on the Start Button & go for the Windows Powershell. Launch in the Administrative Format.

Step 2: Now, execute the following command there. It will Enable the Remote Command on Powershell.

Command: Enable-PSRemoting -Force
1--Enable

How to Check Remote Command Execution Connection on Powershell?

As you start the Powershell Remote Command Execution, you have to check whether the connection is correct or not. For that purpose, you can use the following command. If the Powershell Command is providing some output, the connection is correct. It will help to know whether the Remote Service is running on a Remote Computer or not.

Command: Test-WSMan <IP Address Or Remote Computer>
2--Testing

How to Run Remote Command Execution on Powershell?

Step 1: Once the Remote Command Execution Setup is completed, the following command should be used. It will connect the Local Windows Device along with the Remote Windows Device.

Command: Enter-PSSession -ComputerName <IP Address Or Remote Computer>
3--Connection

Step 2: Now, a Small Window will appear. You have to provide the Username & Password of the device there. Now, click on OK.

4--Enter-Details

Step 3: Now, you will find the Computer Name will appear from the IP Address. Along with the Directory of Powershell will be changed. It is the indication that the Remote Connection is Successfully Created.

5--Details

What are the Benefits of Remote Command Execution on Powershell?

Now, it is time to discuss the Benefits of Windows Powershell Remote Command Execution. There are multiple reasons behind to Use of Remote Execution of Commands on Powershell. Let us check all of those reasons one by one.

  • Efficiency: The Administrator can effectively work on different devices with the same local device. From a single device, the Administrator can access different Powershell Applications on different Windows Devices places at a distance.
  • Scalability: The Remote Command Execution increases the Scalability of any large project. At the same time, the Administrator can work on different computers without physically moving towards it. This increases the Scalability of the project.
  • Consistency: Consistency can be maintained when you execute the Remote Command Execution. In this case, the Constant Configuration Settings can be changed in other devices from a single device.

Conclusion

From the above discussion, we conclude that Configuring Remote Command Execution on Powershell is a very simple task. You have to just enter the Windows Powershell Commands there properly. Also, you have to take care of the IP Address of the Remote Device as it will be inserted into the system for the connection.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Как посмотреть какая разрядность windows 10
  • Как создать общий доступ к папкам в сети windows 10
  • Переход между раскладками клавиатуры в ос windows осуществляется с помощью комбинации клавиш
  • Windows 11 upgrade как пользоваться
  • Особенности работы в операционной системе windows