PowerShell: используем Invoke-Command для запуска команд/скриптов на удаленных компьютерах
В этой статье мы рассмотрим особенности использования командлета 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 — Powershell
На удаленных компьютерах, к которым вы планируете подключаться должен быть запущена служба WinRM. Проверить это можно так:
Если служба не запущена, запустите ее:

Данная команда запустит службу WinRM (установит автоматический запуск), выставит настройки winrm по-умолчанию и добавит исключение в Windows Firewall. Команда Enable-PSRemoting –Force включает WinRM без запроса пользователя.
Теперь к компьютеру можно подключиться удаленно через PowerShell Remoting.
Также нужно включить правило Window Defender Firewall, которое разрешает доступ к WinRM в общедоступных сетях. Вы можете включить правило брандмауэра с помощью GPO или PowerShell:
Чтобы проверить подключение к удаленному компьютер через PowerShell Remoting используется команда:

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

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

Автоматическая Установка программ на подсети Windows или сеть при помощи CMD и PsExec на примере OCS
Либо можно разрешить подключение ко все компьютерам (не рекомендуется, т.к. один из главных недостатков NTLM – он не осуществляет проверку подлинности).
Аналогичные настройки нужно сделать на удаленных хостах.
Чтобы вывести список доверенных хостов, выполните команду:
Чтобы применить изменения, перезапустите службу WinRM:
Удаленное выполнение PowerShell с помощью Invoke-Command
Командлет Invoke-Command позволяет выполнить команду на одном или нескольких удаленных компьютерах.
Например, для запуска одиночной команды на удаленном компьютере можно использовать такую команду:

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

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

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

Список компьютеров можно поместить в переменную (массив):
Или получить из текстового файла:
Также можно получить список компьютеров в ADс помощью командлета Get-ADComputer из модуля AD PowerShell:
Чтобы выполнить команду на всех Windows Server в домене, исопльзуйте такой код:
Если компьютер выключен, или недоступен, благодаря параметру SilentlyContinue скрипт не будет остановлен и продолжит выполнение на других компьютерах.
Чтобы понять с какого компьютера получены результаты, нужно использовать специальную переменную окружения PSComputerName.

При запуске команды через Invoke-Command на нескольких компьютерах она выполняется параллельно. В Invoke-Command есть ограничение на максимальное количество компьютеров, которыми можно управлять одновременно (ограничение на количество одновременных PSSession). Оно определяется параметром ThrottleLimit (по умолчанию 32). Если вам нужно выполнить команду одновременно более чем на 32 компьютерах (например, на 128), используйте параметр –ThrottleLimit 128 (но это вызывает повышенную нагрузку на ваш компьютер).
Если вы хотите запускать команды на удаленном компьютере интерактивно, используйте командлет Enter-PSSession.
Выполнение удаленных команд
Одна команда Windows PowerShell позволяет запускать команды на одном или сотнях компьютеров. Windows PowerShell поддерживает удаленное вычисление с помощью разных технологий, включая WMI, RPC и WS-Management.
PowerShell Core поддерживает инструментарий WMI, WS-Management и удаленное взаимодействие через SSH. В PowerShell 6 RPC больше не поддерживается. В PowerShell 7 и более поздних версиях RPC поддерживается только в Windows.
Дополнительные сведения об удаленном взаимодействии в PowerShell Core см. в следующих статьях:
Удаленное взаимодействие с Windows PowerShell без настройки
Многие командлеты Windows PowerShell имеют параметр ComputerName, который позволяет собирать данные и изменять параметры одного или нескольких удаленных компьютеров. Эти командлеты используют разные протоколы связи и работают во всех операционных системах Windows без специальной настройки.
В эти командлеты входят следующие:
Обычно командлеты, которые поддерживают удаленное взаимодействие без специальной настройки, имеют параметр ComputerName, но не имеют параметра Session. Чтобы найти эти командлеты в сеансе, введите:
Служба удаленного взаимодействия Windows PowerShell
Благодаря использованию протокола WS-Management служба удаленного взаимодействия Windows PowerShell позволяет запустить любую команду Windows PowerShell на одном или нескольких удаленных компьютерах. Вы можете устанавливать постоянные подключения, запускать интерактивные сеансы и выполнять скрипты на удаленных компьютерах.
Чтобы использовать службу удаленного взаимодействия Windows PowerShell, удаленный компьютер должен быть настроен для удаленного управления. Дополнительные сведения, в том числе инструкции, см. в разделе about_Remote_Requirements.
После настройки службы удаленного взаимодействия Windows PowerShell вы получите доступ ко многим стратегиям удаленного взаимодействия. В этой статье перечислены только некоторые из них. См. дополнительные сведения об удаленном взаимодействии.
Запуск интерактивного сеанса
Чтобы запустить интерактивный сеанс с одним удаленным компьютером, используйте командлет Enter-PSSession. Например, чтобы запустить интерактивный сеанс с удаленным компьютером Server01, введите:
В командной строке отобразится имя удаленного компьютера. Все команды, введенные в командной строке, запускаются на удаленном компьютере, а результаты отображаются на локальном компьютере.
Чтобы завершить интерактивный сеанс, введите:
См. дополнительные сведения о командлетах Enter-PSSession и Exit-PSSession:
Выполнение удаленной команды
Чтобы выполнить команду на одном или нескольких компьютерах, используйте командлет Invoke-Command. Например, чтобы выполнить команду Get-UICulture на удаленных компьютерах Server01 и Server02, введите:
Выходные данные будут возвращены на ваш компьютер.
Запуск сценария
Например, следующая команда выполняет скрипт DiskCollect.ps1 на удаленных компьютерах Server01 и Server02.
Установка постоянного подключения
После установки сеансов в них можно выполнить любую команду. Так как сеансы являются постоянными, вы можете собирать данные из одной команды и использовать их в другой.
Расширенная служба удаленного взаимодействия
Это и есть служба удаленного взаимодействия Windows PowerShell. Используя командлеты, установленные с Windows PowerShell, можно установить и настроить удаленные сеансы с локальных и удаленных компьютеров, создать настраиваемые и ограниченные сеансы, разрешить пользователям импортировать команды из удаленного сеанса, которые могут неявно выполняться в удаленном сеансе, настроить безопасность удаленного сеанса и многое другое.
См. дополнительные сведения о поставщике WSMan и командлетах WS-Management или введите команду Get-Help wsman в консоли Windows PowerShell.
Дополнительные сведения можно найти в разделе
Справку по ошибкам службы удаленного взаимодействия см. в разделе about_Remote_Troubleshooting.
Удаленное управление через Powershell

В Powershell есть несколько методов удаленного подключения. Это через:
Этот командлет устанавливает сессию c удаленным компьютером и мы сможем работать прям на нем. Если сравнивать с Linux, то это почти одно и то же:
И второй командлет, который нужен для удаленного выполнения команд как на одном, так и сотни компьютеров:
Если опять же сравнить с Linux ssh, то это почти одно и то же:
Как настроить удаленное управление через Powershell?
Для того что бы суметь настроить нужно понять как это работает. Команды выше могут работать по протоколу HTTP (по порту 5985) и HTTPS (5986), за исключением версии Powershell 1.0, который работал в XP (там порт 80/443). По умолчанию у нас стоит HTTP, но и эти данные шифруются используя симметричный ключ AES-256. Сама аутентификация работает в 2 режимах NTLM и Kerberos(по умолчанию стоит он).
Если у вас сеть с домен контроллером, т.е. есть Kerberos, то у вас должны работать команды выше. Если компьютеры в Workgroup, то они используют NTLM и для этого нужна дополнительная настройка. Кроме того, если вы вместо имен используете IP, то вы в любом случае используете NTLM и это по умолчанию не работает.
Если у вас не работают команды выше нужно проверить запущен ли сервис WinRM на том компьютере, к которому мы хотим подключиться:
В этом случае мы ставим запуск сервиса автоматически и настраиваем winrm в дефолтной конфигурации. Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.
Если вы работаете под профилем сети «Public» (не «Domain» или «Private»), то нужно выполнить еще один командлет, разрешающий работать в таких сетях:
Если мы выполним такую команду:
Получим ошибку:
Connecting to remote server 192.168.3.100 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.
Которая говорит, что мы можем подключится по IP если используем HTTPS (для этого нужен сертификат) или добавить хост, к которому подключаемся в TrustedHost компьютера с которого хотим запустить команду. Для этого делаем:
После этого все будет работать, но команды должны исполняться с переменной, в которой будут лежать учетные данные пользователя. Т.е. так:
Так же отмечу, что все команды, которые мы запускаем для удаленного выполнения через Poweshell, должны происходить от члена группы Администратора того хоста, к которому мы подключаемся.
Теперь мы можем устанавливать множество сессий с помощью командлета:
Получать ID этих сессий:
И подключаться по этим ID:
Или использовать с invoke существующую сессию, а командлет для удаленного компьютера запускать с файла:
Или же использовать методы описанные выше.
Дополнительные ключи мы можем узнать по командлетам:
Установка программ через powershell на удаленном компьютере
Укажите явно Credentials.
Все ответы
не хочется для этого создавать pssession с каждым удаленным компом, команда взята отсюда
прочитал статью, у меня операция в один hop, делегирование не нужно.
на контроллере домена win2008 я запускаю команду установки приложения на клиент win7.
Покопаю дальше в сторону делегирования.
прочитал статью, у меня операция в один hop, делегирование не нужно.
на контроллере домена win2008 я запускаю команду установки приложения на клиент win7.
Покопаю дальше в сторону делегирования.
В свойства клиента(WIN7) поставили галочку для делегирования?
Удаленное управление с помощью PowerShell
Существует довольно много методов для работы с удаленными компьютерами. Есть Windows Management Instrumentation (WMI), широко используемый в VBScript. Есть различные утилиты, которые позволяют осуществлять удаленное управление, типа PSExec от Sysinternals. Даже многие командлеты PowerShell имеют параметр ComputerName для выполнения на удаленных компьютерах.
В общем методов полно, но у каждого из них есть свои минусы. Во первых — разный синтаксис, в котором легко запутаться. Во вторых — некоторые команды ведут себя по разному в зависимости от того, локально или удаленно они выполняются. Ну и наконец, для связи может потребоваться открытие дополнительных портов на брандмауэре, что не есть хорошо с точки зрения безопасности.
PowerShell Remoting решает большинство описанных проблем. Он основан на Microsoft реализации протокола Web Services for Management (WS-Management), а для связи использует службу Windows Remote Management (WinRM). Связь между компьютерами осуществляется по HTTP (по умолчанию) или HTTPS. Весь трафик между двумя компьютерами шифруется на уровне протокола (за исключением случаев, когда используется SSL). Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos.
В отличие от утилит, использующих различные программные интерфейсы, PS Remoting работает следующим образом: команды, вводимые на локальном компьютере, передаются на удаленный компьютер и там выполняются, затем результат передается обратно. Поскольку все команды выполняются локально, нет необходимости заботится о совместимости. Кроме того, для работы PS Remoting нужен всего один открытый порт на брандмауэре.
Есть несколько способов управления с помощью PowerShell Remoting.
Управление «один к одному»
Самый простой способ удаленного управления — интерактивно открыть удаленную сессию и в ней выполнить нужные действия. Например, откроем сессию на компьютер SRV4 и рестартуем на нем сервис печати:
Посмотрим состояние сервиса и закроем удаленную сессию:
Источник: doma35.ru
ITСooky
Скрипт Powershell для обновления клиента 1С Предприятие на нескольких доменных ПК по сети!
Автор Александр дата 01.03.2020

Powershell оказывается тоже может быть полезным… если в него поверить… если его заставить! Есть тысяча ПК и один IT-специалист(он же системный администратор, специалист инфраструктуры, тыжайтишник, грузчик, бухгалтер), обновить 1С 8.3 Предприятие надо вчера! 1С сам по себе тоже замечательная штуковина, запускаешь базу и она привязана к определенной версии клиента, которую ищет и запускает на ПК пользователя! А версии этого клиента обновляются по цать раз в год и работают только с конкретной версией базы, это вам не SAP-GUI какой-нибудь — минорные обновления каждые 5 лет — 1С это живая система постоянно надо что-то допиливать, и пинать ссаными тряпками чтобы работала!
Но, вернуемся к Powershell, чтобы он работал на компутерах они должны быть в домене AD, для них должны быть включена разрешения на исполнение Powershell Remote как-нибудь через AD GP!
Powershell скрипт нельзя запустить двойным щелчком или через иконку(не верите попробуйте). Сначала запускаем ISE как админ, при этом самому надо быть AD админом — с правами придется в любом случае повозиться, но мне повезло и админы сбежавшие до меня уже об этом подумали! Команды чтобы проверить есть ли возможность на удаленном ПК исполнять Powershell нет, но можно в ISE стартануть удаленную сессию Powershell зайти(надо подождать минуту не сразу отвечает) и попытаться что-то исполнить — это будет занчит что то что нужно работает!
Обновлять будем в три этапа
1. Опросим доступные по сети ПК на предмет наличия 1С и его версии
2. Отправим на них команду установить новую версию 1С
3. Еще раз опросим и узнаем появилась ли новая версия 1С на пк
Powershell скрипт для получения версии ПО на удаленном ПК
Мне нужен файл с хостами, вытащим его из AD из компьютерных групп.
Сначала удоляем hosts.txt потом туда закачиваем списки из OU.
rm $PSScriptRoothosts.txt Get-ADComputer -Filter * -SearchBase “OU=DESKTOPS,OU=NIZHNEWARTOVSK,OU=Russia,OU=All,DC=com,DC=tesla,DC=local” | select -exp Name | ForEach-Object < Add-Content $PSScriptRoothosts.txt «$_»>Get-ADComputer -Filter * -SearchBase “OU=NOTEBOOKS,OU=NIZHNEWARTOVSK,OU=Russia,OU=All,DC=com,DC=tesla,DC=local” | select -exp Name | ForEach-Object
Теперь опрашиваем эти хосты, узнаем доступны ли они по сети, если нет пишем что нет в файл result_down.txt. Ищем имя производителя ПО оно может быть на английском(1C-Soft -непонятно почему), на русском(1С-Софт -понятно) и возможно еще на каком-то.
Там же ищем версию которую нам надо установить 8.3.16.1148, а вдруг уже установлена!
rm $PSScriptRoothosts_to_add.txt rm $PSScriptRoothosts_down.txt rm $PSScriptRootallready_installed.txt Get-Content $PSScriptRoothosts.txt | ForEach-Object < if(!(Test-Connection -Cn $_ -BufferSize 16 -Count 1 -ea 0 -quiet)) < Add-Content $PSScriptRoothosts_down.txt «$_» >else < $1cversion = Get-WmiObject -Class Win32_Product -ComputerName $_ | where| select -exp Version if($1cversion -like «8.3.16.1148») < Write-Host «$_ — Allready installed 8.3.16.1148» -ForegroundColor Cyan Add-Content $PSScriptRootallready_installed.txt «$_» >else < Write-Host «$_ — Not present 8.3.16.1148» -ForegroundColor Cyan Add-Content $PSScriptRoothosts_to_add.txt «$_» Get-Service remoteregistry -ComputerName «$_» | start-service >> >
Кстати этот опрос, в зависимости от паршивости ПК займет один рабочий день 8-часов для примерно 1000 ПК(старых-новых)! Ну и надо его делать в рабочее время когда ПК онлайн!
Powershell скрипт для установки ПО на несколько компьютеров по сети
Теперь выясняется что — нельзя просто так зайти на удаленных ПК по Powershell и запустить там тихую установку (для 1С аргумент /quiet) из дистрибутива на сетевой шаре. Запускать можно только с локальных папок — поэтому сначала копируем на удаленный ПК файлы установки а потом запускаем!
Get-Content $PSScriptRoothosts_to_add.txt | ForEach-Object < Get-Service remoteregistry -ComputerName «$_» | start-service Write-Host «$_ — Copying files to host wait» -ForegroundColor Red Copy-item -Path «\RUNVFS1002937446777soft1C838_3_16_1148» -Destination «\$_c$windowstemp» -Recurse -force Write-Host «$_ — Starting quiet installation porcess» -ForegroundColor Cyan $InstallString = «C:windowstemp8_3_16_1148setup.exe /quiet» ([WMICLASS]»\$_ROOTCIMV2:Win32_Process»).Create($InstallString)
Это тоже занимает рабочий день для 100 ПК, для старых гораздо дольше чем для новых, еще и встает иногда на пол часа просто так.
Powershell скрипт для проверки версии ПО на нескольких компьютерах по сети
Тут с одной стороны немного тупо, ищем просто версию во всем выводе установленных программ, считаем что она уникальна!
А с другой стороны это самый верный способ найти — если делать по умному искать сначала по производителю 1С то не всегда находит новую версию даже при успешной установке!
rm $PSScriptRootresult_installed.txt rm $PSScriptRootresult_not_installed.txt Get-Content $PSScriptRoothosts_to_add.txt | ForEach-Object < if(!(Test-Connection -Cn $_ -BufferSize 16 -Count 1 -ea 0 -quiet)) < Write-Host «$_ is down» -ForegroundColor Red >else < $1cversion = Get-WmiObject -Class Win32_Product -ComputerName $_ | where| select -exp Version if($1cversion -like «8.3.16.1148») < Add-Content $PSScriptRootresult_installed.txt «$_» Write-Host «Yes for $_» -ForegroundColor Cyan >else < Add-Content $PSScriptRootresult_not_installed.txt «$_» Write-Host «No for $_» -ForegroundColor Red>> >
Источник: itcooky.com
PowerShell. Удалённая установка приложения с параметрами
Требуется написать PowerShell-скрипт, который бы выполнял тихую установку приложения на сервере. Локальная установка выполняется успешно такой командой (в командной строке):
msiexec /i «\srvdistrMQServerMSIIBM WebSphere MQ.msi» /l*v «%temp%MQ.log» /q TRANSFORMS=»1033.mst» USEINI=»\srvdistrMQServerResponse.ini»
Пробую запустить скрипт PowerShell локально — не получается. Скрипт такой:
$arg = «‘/i «‘c:distrMQServerMSIIBM WebSphere MQ.msi'» /l*v «%temp%MQ.log» /q TRANSFORMS = «1033.mst» USEINI = «c:distrMQServerResponse.ini»‘» Start-Process -FilePath msiexec.exe -ArgumentList $arg -wait -passthru
Неожиданный токен «c:distrMQServerMSIIBM WebSphere MQ.msi» в выражении или инструкции. C:UsersAdministratorDocumentsinstall_MQ_local.ps1:1 знак:58 + $arg = «/i «‘c:distrMQServerMSIIBM WebSphere MQ.msi’
Пробовал по разному — заключал путь и весь аргумент в одинарные, двойные кавычки, фигурные скобки. Пробовал писать не в переменную, а в ArgumentList — не получается, появляются разные ошибки. Если локально скрипт будет работать, нужно его запустить на уделённом компьютере, например следующая команда сработает или посоветуете другой способ?
$script = Start-Process -FilePath msiexec.exe -ArgumentList $arg -wait -passthru Invoke-Command -ComputerName server2 -ScriptBlock $script
Скрипт должен запускаться на Windows 7 и Windows Server 2008 R2, соответственно PowerShell версии 2.
Источник: ru.stackoverflow.com