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

На сегодняшний день PowerShell Remoting является основным инструментом удаленного управления операционными системами Windows. Поэтому, знать о его возможностях и использовать в своих повседневных задачах должен каждый системный администратор Windows. Для запуска команд на удаленных компьютерах с помощью PowerShell Remoting, можно использовать командлет Powershell Invoke-Command (псевдоним icm).

Функционал командлета Invoke-Command основан на протоколе Web Services for Management (WS-Management) и службе Windows Remote Management (WinRM), используемой для связи. Связь между компьютерами выполняется по протоколу HTTP (по умолчанию) или HTTPS. Весь трафик между двумя компьютерами зашифрован на уровне протокола. Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos. Возможность создания удаленных сеансов появилась в версии Powershell 2.0.

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

  1. Нужно разрешить удаленные подключения: Enable-PSRemoting -Force
  2. Запустить службу WinRM: Start-Service WinRM
  3. Создать правило Брандмауэра Windows, разрешающее входящие подключения по этому протоколу.

Компьютер, с которого планируется удаленно управлять другими компьютерами/серверами через PowerShell Remoting также нужно донастроить:

  1. Необходимо разрешить подключения к удаленным системам. Для предоставления доступа ко всем удаленным компьютерам, воспользуйтесь командой: Set-Item wsman:\localhost\client\trustedhosts * -Force
  2. Убедитесь, что файервол не блокирует исходящие подключения.

Теперь, чтобы выполнить команду на удаленном компьютере через Powershell Remoting (например, вы хотите перезапустить службу печати Spooler), вам нужно выполнить такую команду:

Invoke-Command -computername server1 -credential domain\user1 -scriptblock { Restart-Service spooler}

Эта команда выполняет команду Restart-Service spooler на удаленном компьютере с именем server1. Параметр Credential используется для выполнения команды в контексте безопасности доменного пользователя domain\user1.

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

Чтобы запустить задачу в фоновом режиме, вы можете указать параметр -AsJob.

Invoke-Command -scriptblock

При запуске команды в фоновом режиме PowerShell не возвращает ее результаты. Чтобы получить их, нужно использовать командлет Receive-Job.

Get-job –id 3 |Receive-Job

Для запуска не одной команды, а целого скрипта PowerShell, командлет Invoke-Command имеет специальный аргумент -FilePath, который нужно использовать вместо -ScriptBlock для указания пути к файлу скрипта. Например, я создал небольшой скрипт PoSh, который отображает список остановленных служб. Выполним данный скрипт на удаленном компьютере:

Invoke-Command -computername server1 -FilePath .\list.ps1

Invoke-Command computername FilePath

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

Достаточно часто возникает необходимость одновременно выполнять одну и ту же команду/скрипт на нескольких компьютерах. С помощью Invoke-Command это реализуется довольно просто. Можно перечислить имена компьютеров, разделив из запятыми в аргументе -ComputerName.

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName server1,server2,server3

Либо поместить из в массив:

$srv_list = @(″server4″,″server5″,″server6″)
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName $servers

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

Invoke-Command -ScriptBlock {Restart-Service spooler} –ComputerName (Get-Content .\servers_list.txt)

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

Примечание. У командлета Invoke-Command есть параметр ThrottleLimit который позволяет установить максимальное количество компьютером, на которых одновременно может выполнятся одна и та же команда. По умолчанию число компьютером ограничено цифрой 32. При необходимости это число можно увеличить, но имейте в виду, что увеличение этого параметра увеличивает нагрузку на процессор и память вашего компьютера, поэтому эту операцию нужно выполнять с осторожностью.

Если установлен модуль ActiveDirectory для PowerShell, становится возможным одновременно запускать команды на множестве компьютеров, выбираемых из AD с использованием конвейеров:

Get-ADComputer -Filter * -properties name | select {Name="computername";Expression={$_."name"}}| Invoke-Command -ScriptBlock {hostname}

Каждый раз при запуске Invoke-Command, создается новый сеанс, который потребляет некоторое время процессора и ресурсы. Чтобы избежать лишнего расходования ресурсов, можно использовать один сеанс для выполнения всех команд. Например, создадим новый сеанс sess1 с компьютером computer1 и присвоим его переменной $session, а затем выполним свою задачу в этом сеансе:

$session = New-PSSession -ComputerName computer1  -Name sess1
Invoke-Command -ScriptBlock { Restart-Service spooler } -Session $session

Данный Сеанс будет активен, пока вы не закроете консоль PowerShell. Вы также можете закрыть сеанс (Disconnect-PSSession) или удалить его (Remove-PSSession).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *