Поиск по сайту:

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


Вы хотите выполнить команду PowerShell на удаленном компьютере или сервере? Тогда вам не нужно открывать удаленное подключение к рабочему столу, потому что вы можете просто использовать PowerShell Invoke-Command для этого.

Invoke-Command позволяет вам выполнять команды и скрипты PowerShell на одном или нескольких удаленных компьютерах, одновременно перенаправляя результаты в вашу собственную консоль. Это делает его отличной командлетой для быстрого управления удаленными устройствами.

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

Предварительные требования Invoke-Command

Прежде чем мы сможем использовать Invoke-Command на удаленном сервере или компьютере, нам нужно убедиться, что служба Windows Remote Management работает. Также, если у вас включен брандмауэр Windows в вашей сети, то необходимо проверить, не блокирует ли брандмауэр соединение.

Чтобы проверить, принимает ли удаленный компьютер удаленное управление, мы можем использовать простую команду PowerShell, Test-WSMan

Test-WSMan -Computername la-srv-dc01

Если вы получили ошибку, что не можете подключиться к месту назначения, значит, служба Windows Remote Management не запущена. Чтобы включить ее, мы можем использовать командлет PowerShell Enable-PSRemoting на удаленном компьютере:

Enable-PSRemoting

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

Но даже лучший вариант - создать новый объект групповой политики (GPO). Таким образом, вы можете легко включить службу удаленного управления на нескольких компьютерах или серверах.

Вы можете найти настройку политики в Конфигурация компьютера > Параметры Windows > Настройки безопасности > Системные службы.

Правило межсетевого экрана

Файрвол Windows заблокирует все входящие подключения, включая подключение к Windows Remote Management. Поэтому прежде чем мы сможем использовать Invoke-Command, нам нужно будет разрешить входящее подключение.

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

  1. Перейдите к Конфигурация компьютера > Настройки Windows > Параметры безопасности > Брандмауэр Windows Defender с расширенной безопасностью
  2. Щелкните правой кнопкой мыши на Входящих правилах и выберите Новое правило
  3. Выберите Предопределенное и выберите Удаленное управление Windows
  4. Выберите правило с профилем Домен, Ч частный
  5. Выберите Разрешить соединение и нажмите Завершить

Убедитесь, что новые политики обновлены на сервере/клиенте, используя команду GPUpdate.

Используя Invoke-Command

Команда Invoke-Command в PowerShell позволяет выполнять команду или скрипт на удаленном компьютере. Когда вам нужно выполнить несколько команд на удаленном компьютере, лучше использовать командлет New-PSSession.

Структура команды Invoke-Command довольно проста, но тем не менее, существует довольно много опций (параметров), которые мы можем использовать:

ComputerName

Имя компьютера или IP-адрес для выполнения команды. Для нескольких компьютеров разделите имена запятой ,

Credential

Учетные данные для подключения к удаленному компьютеру

FilePath

Указывает путь к локальному скрипту для выполнения на удаленном компьютере(ах)

AsJob

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

InDisconnectedSession

Ранее запускал команду в отключенной сессии на удаленном компьютере

ScriptBlock

Скрипт или команда для выполнения

ArgumentList

Используется для передачи аргументов в cmdlet в блоке скрипта

Параметры Invoke-Command

Итак, чтобы просто выполнить команду PowerShell на удаленном компьютере, нам нужно всего лишь указать имя удаленного компьютера и команду, которую мы хотим выполнить внутри блока скрипта. Например, чтобы получить информацию о компьютере с контроллера домена, мы можем сделать:

Invoke-Command -ComputerName la-srv-dc01 {Get-ComputerInfo}

Это выполнит команду Get-ComputerInfo на контроллере домена (la-srv-dc01) и вернет результаты в консоль.

Запуск скрипта

В приведенном выше примере мы просто выполняем простую команду PowerShell. Но мы также можем запускать полные скрипты на удаленном компьютере. Вы могли бы просто написать скрипт внутри параметра scriptblock, но проще сохранить скрипт в переменной или использовать файл.

Пример ниже работает хорошо, но читать его немного сложнее таким образом:

Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock {Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}}

Лучшим вариантом было бы сначала сохранить скрипт внутри переменной. Затем мы можем просто передать переменную в блок скрипта:

$script = {
    Get-CimInstance Win32_LogicalDisk | 
        Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}
}

Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock $script

Третий вариант состоит в том, чтобы сохранить скрипт на вашем локальном компьютере и ссылаться на скрипт с помощью параметра -FilePath:

Invoke-Command -ComputerName la-srv-dc01 -FilePath c:\test\diskInfo.ps1

Запуск на нескольких компьютерах

Одним из больших преимуществ командлета Invoke-Command в PowerShell является то, что вы можете запускать его на нескольких компьютерах одновременно. Существует несколько вариантов, чтобы сделать это, мы просто можем указать имена компьютеров, разделенные запятой:

Invoke-Command -ComputerName la-srv-dc01, la-srv-app01, la-srv-file01 -FilePath c:\test\diskInfo.ps1

Другой вариант записи этого - использовать хеш-таблицу и распаковку. Распаковка параметров сделает ваш скрипт более читаемым, когда вам нужно добавить много свойств.

$parameters = @{
    ComputerName      = 'la-srv-dc01', 'la-srv-app01', 'la-srv-file01', 'la-win11-lab03'
    ScriptBlock       = { Get-ComputerInfo }
  }
Invoke-Command @parameters

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

Если вы запускаете командлет Invoke-Command обычно, то ваш локальный компьютер подключится к удаленному компьютеру, запустит скрипт, подождет результатов и отключится. Ожидание занимает больше всего времени и ресурсов на вашем локальном компьютере, особенно при подключении к 100 и более компьютерам.

С параметром InDisconnectedSession командлет будет только подключаться к удаленному компьютеру, запускать скрипт, а затем отключаться. Это значительно сокращает время всего процесса.

$parameters = @{
    ComputerName          = (Get-Content -Path C:\Test\Servers.txt)
    InDisconnectedSession = $true
    FilePath              = '\\a-d\scripts\InstallWinUpdates.ps1'
}
Invoke-Command @parameters

Использование учетных данных

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

Для решения этой проблемы мы можем использовать параметр -Credentials. Здесь вы можете ввести учетную запись пользователя, которую хотите использовать для выполнения команды. PowerShell запросит у вас пароль, когда вы выполните командлет Invoke-Command с параметром -Credential:

Invoke-Command -ComputerName la-srv-dc01 -Credential a-d\administrator -Scriptblock {Get-ComputerInfo}

Как и с большинством командлетов PowerShell, вы также можете передать объект учетных данных в командлет -Credential. Этот метод особенно удобен, когда вы хотите выполнить несколько команд или вам нужно запустить разные команды на разных удаленных компьютерах:

$cred = Get-Credential

Invoke-Command -ComputerName la-srv-dc01 -Credential $cred -Scriptblock {Get-ComputerInfo}

Включить локальные переменные

Использование переменных внутри блока скрипта немного отличается от того, как вы могли ожидать. Давайте рассмотрим следующий упрощенный пример: мы хотим получить все файлы из заданного пути на удаленном компьютере. В этом случае мы сохранили путь в переменной:

$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Childitem -Path $path}

Приведенный выше пример не сработает. Удаленный компьютер, в данном случае la-srv-dc01, не знает, что такое переменная $path, поэтому он не вернет никаких результатов.

Чтобы передать переменную path в блок скрипта, нам нужно будет использовать модификатор области Using. Область Using указывает, что переменная создается в локальной сессии, а не в удаленной. Таким образом, чтобы передать переменную $path в удаленную сессию, нам нужно сделать:

$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Chiditem -Path $Using:path}

Завершение

Команда Invoke-Command в PowerShell — отличный инструмент для управления удаленными компьютерами. Она позволяет быстро выполнить команду без необходимости открывать удаленный рабочий стол. Особенно это полезно, когда нужно выполнить команду на нескольких компьютерах одновременно.

Убедитесь, что вы также ознакомились с командлетом New-PSSession, это действительно лучший вариант, когда вам нужно выполнить несколько команд на удалённом компьютере.

Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.