PowerShell Remoting: Выполняйте удаленные команды как профессионал

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

Это руководство демонстрирует настройку и использование PowerShell Remoting в среде Active Directory (AD). Представьте, что можно создавать файлы, запускать скрипты или проверять конфигурации удаленно, не покидая рабочего места.

Настройте и используйте PowerShell Remoting для уверенного выполнения скриптов на удаленных системах!

Настройка PowerShell Remoting для стандартного пользователя

Прежде чем в полной мере воспользоваться PowerShell Remoting, убедитесь, что необходимые разрешения настроены правильно. Выполнение команд или скриптов удаленно зависит от корректной конфигурации, особенно в средах Active Directory, где безопасность имеет высший приоритет.

Начните с попытки подключиться к удаленному серверу (SRV2) с использованием Invoke-Command. Следующая команда запускает скриптовый блок на удаленном компьютере:

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

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

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

Проверьте членство в группе:

Get-LocalGroupMember -Group 'Remote Management Users'

Если пользователя нет в списке, добавьте его:

Add-LocalGroupMember -Group 'Remote Management Users' -Member user
Get-LocalGroupMember -Group 'Remote Management Users'

Теперь повторите команду Invoke-Command, чтобы подтвердить соединение.

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

Запуск базового скрипта удаленно

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

Чтобы увидеть, как работает удаленное управление PowerShell, создайте текстовый файл на удаленной машине, затем убедитесь, что действие прошло успешно.

Определите и выполните блок скрипта:

$scriptblock = { Set-Content -Path 'somefile.txt' -Value '' }
Invoke-Command -Scriptblock $scriptblock -ComputerName SRV2

Проверьте, был ли создан файл с помощью следующей команды:

Эта команда подключается к удаленному компьютеру SRV2, извлекает информацию о файле somefile.txt и выводит только его имя и время создания.

icm -ComputerName SRV2 -ScriptBlock {Get-Item somefile.txt} | Select-Object Name, CreationTime

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

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

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

Создайте скрипт локально с помощью этой команды, где:

  • $scriptContents хранит скрипт в многострочной строке с использованием здесь-строки (@' ... '@), что полезно для поддержания читаемости и организации скрипта.
  • Set-Content записывает содержимое $scriptContents в файл с именем *RunThisRemotely.ps1* в текущем каталоге.
$scriptContents =
@'
Write-Host "Deleting the file just created..."
Remove-Item -Path somefile.txt
'@
Set-Content -Path 'RunThisRemotely.ps1' -Value $scriptContents

Подтвердите содержимое скрипта:

Get-Content RunThisRemotely.ps1

Запустите скрипт удаленно:

Invoke-Command -ComputerName SRV2 -FilePath RunThisRemotely.ps1

Теперь проверьте, был ли удален тестовый файл:

icm -ComputerName SRV2 -ScriptBlock {Test-Path somefile.txt}

Проверка локальных ключей реестра с помощью скриптового блока

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

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

# Define an array of registry paths to check
$registryKeyPaths = @(
    'HKLM:\SOFTWARE\Microsoft\AppV\', 
    'HKLM:\SOFTWARE\Microsoft\AccountsControl\'
)

Добавьте это в скрипт, чтобы определить скриптовый блок ****($localScriptBlock), который выполняется локально на компьютере. Скриптовый блок проверяет, существуют ли определенные пути реестра на локальной машине, и предоставляет обратную связь для каждого пути.

# Define the script block that will run locally on the computer
$localScriptBlock = {
    ## Iterate through each registry path in the $registryKeyPaths array
    foreach ($path in $registryKeyPaths) {
        # Check if the current registry path exists on the local machine
        if (Test-Path -Path $path) {
            # If the path exists, output a message confirming its existence
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            # If the path does not exist, output a message stating its absence
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

Выполните скриптовый блок и посмотрите, что произойдет.

Invoke-Command -ScriptBlock $localScriptBlock

Передача локальных переменных в удаленные сеансы

Независимо от того, работаете вы с массивами, строками или объектами, вы можете передавать данные удаленным командам двумя способами:

  • $using – интегрирует локальные переменные непосредственно в скриптовый блок.
  • ArgumentList – явно передает переменные в блок для использования.

Читать далее, чтобы изучить два метода ($using или ArgumentList) для достижения этой цели.

Использование ключевого слова $using (Предпочтительный подход)

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

Создайте этот сценарий для запуска на удаленном компьютере и проверьте указанные пути реестра. Этот сценарий предоставляет обратную связь о том, существует ли каждый путь или нет.

С этим подходом вы просто добавляете префикс $using к локальной переменной. Это действие указывает PowerShell ссылаться на локальную переменную registryKeyPaths перед выполнением кода на удаленном компьютере.

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $using:registryKeyPaths) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

Затем можно вызвать удаленную команду для выполнения кода на удаленной машине:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2

Похоже, что ключи реестра также существуют там.

Использование параметра ArgumentList

Помимо ключевого слова $using, другим вариантом является параметр ArgumentList для отправки переменных в удаленный сеанс.

Создайте сценарий (подобный сценарию с ключевым словом $using), который использует массив $args для доступа к значениям, переданным через параметр ArgumentList.

В этом методе вы указываете одну или несколько переменных для отправки в удаленный сеанс через параметр ArgumentList. Внутри блока сценария замените локальную переменную на $args, которую PowerShell автоматически заполнит значениями, переданными через ArgumentList.

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $args) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

Теперь выполните сценарий следующей командой:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2 -ArgumentList $registryKeyPaths

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

Следуя этим шагам, вы можете эффективно настроить и использовать удаленное выполнение команд и сценариев в PowerShell для запуска команд и сценариев на удаленных системах.

Заключение

В этом учебнике вы узнали, как настроить удаленное выполнение команд в среде Active Directory, запускать команды и сценарии на удаленных системах, а также эффективно передавать переменные. Эти базовые навыки необходимы для автоматизации административных задач и эффективного управления системами.

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

Возможности PowerShell для удаленного выполнения бесконечны, так что начните экспериментировать и сделайте свои рабочие процессы более эффективными!

Source:
https://adamtheautomator.com/powershell-remoting-guide/