PowerShell Многоразовые Сеансы: Руководство по Постоянным Удаленным Подключениям

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

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

Готовы повысить свои навыки удаленного управления PowerShell? Давайте приступим!

Создание и использование сеанса

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

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

Для начала вам нужно создать повторно используемый сеанс.

Команда New-PSSession устанавливает постоянное соединение с удаленным компьютером:

$session = New-PSSession -ComputerName SRV2

Этот объект сеанса может быть передан командам, таким как Invoke-Command, что позволяет вам использовать один и тот же сеанс во всем скрипте.

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

Invoke-Command -Session $session -ScriptBlock { hostname }

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

Invoke-Command -Session $session -ScriptBlock { $foo = 'Please be here next time' }
Invoke-Command -Session $session -ScriptBlock { $foo }

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

Адаптация функции для удаленного использования

Давайте адаптируем функцию инвентаризации для работы с повторно используемыми сеансами.

Сначала добавим параметр Session для принятия объекта сеанса, где команда Get-Member помогает определить тип объекта сеанса:

$session | Get-Member

После определения того, что объект сеанса относится к типу System.Management.Automation.Runspaces.PSSession, следующим шагом будет определение функции Get-WmiObjectValue.

Эта функция использует параметр сеанса для возможности удаленного выполнения, позволяя ей запускать блок сценария на удаленной системе и извлекать определенное свойство WMI.

function Get-WmiObjectValue {
    [CmdletBinding()]
    param(
        # Specify the name of the WMI property to query
        [Parameter(Mandatory)]
        [string]$PropertyName,

        # Specify the name of the WMI class to query
        [Parameter(Mandatory)]
        [string]$WmiClassName,

        # Specify the remote session object to use for invoking the command
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    # Define the script block to execute on the remote machine
    $scriptBlock = {
        # Get the sum of the specified property from the WMI class
        $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum

        # Convert the sum to gigabytes
        $numberGb = $number / 1GB

        # Round the result to 2 decimal places
        [math]::Round($numberGb, 2)
    }

    # Execute the script block on the remote machine using the provided session
    Invoke-Command -Session $Session -Scriptblock $scriptBlock
}

Давайте попробуем эту функцию и посмотрим, что произойдет.

Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session

В какой-то момент вы столкнетесь с этой ошибкой. Но не волнуйтесь. Читайте дальше, и вы узнаете, как исправить эту ошибку.

Решение проблем с аутентификацией

Если вы столкнулись с ошибками “Отказано в доступе”, вероятно, это из-за недостаточных прав. По умолчанию повторно используемые сеансы наследуют учетные данные, использованные для их создания.

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

whoami

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

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

$adminCred = Get-Credential -UserName adam

После аутентификации протестируйте сеанс:

Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred

Этот тест гарантирует, что сеанс работает ожидаемым образом перед выполнением вашей функции инвентаризации.

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

Remove-PSSession -Session $session

Команда Remove-PSSession удаляет сеанс как на локальном, так и на удаленном компьютере.

После удаления старого сеанса создайте новый. На этот раз создайте сеанс с аутентификацией от имени администратора:

$session = New-PSSession -ComputerName SRV2 -Credential $adminCred

Попробуйте снова выполнить команду Invoke-Command с использованием нового сеанса и посмотрите, что произойдет.

Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred

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

Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session

Сводим всё воедино

Тяжелая работа завершена, пришло время объединить все в один скрипт.

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

function Get-WmiObjectValue {
    [CmdletBinding()]
    param(
        # Specify the name of the WMI property to query
        [Parameter(Mandatory)]
        [string]$PropertyName,

        # Specify the name of the WMI class to query
        [Parameter(Mandatory)]
        [string]$WmiClassName,

        # Specify the remote session object to use for invoking the command
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    # Define the script block to execute on the remote machine
    $scriptBlock = {
        # Get the sum of the specified property from the WMI class
        $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum

        # Convert the sum to gigabytes
        $numberGb = $number / 1GB

        # Round the result to 2 decimal places
        [math]::Round($numberGb, 2)
    }

    # Execute the script block on the remote machine using the provided session
    Invoke-Command -Session $Session -Scriptblock $scriptBlock
}

## Grab the alternate credential: Get-CimInstance will work on the remote computer
$adminCred = Get-Credential -UserName adam

## Create a session authenticating as the adam (admin) user
$session = New-PSSession -ComputerName SRV2 -Credential $adminCred

## Find the total memory and total volume storage space on the remote computer
$totalMemoryGb = Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
$totalStorageGb = Get-WmiObjectValue -PropertyName FreeSpace -WmiClassName Win32_LogicalDisk -Session $session

Write-Host "The computer $($session.ComputerName) has $totalMemoryGb GB of memory and $totalStorageGb GB of free space across all volumes."

## Remove the shared session
Remove-PSSession -Session $session

Сохраните и запустите скрипт (Get-InventoryInfo.ps1), чтобы убедиться, что он работает как задумано.

Вывод

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

Двигаясь дальше, вы можете развивать эти знания, интегрируя повторно используемые сеансы в более крупные рабочие процессы автоматизации. Один из примеров – расширение функции инвентаризации для сбора дополнительных метрик системы или автоматизации задач по обслуживанию на нескольких удаленных машинах.

Объедините многоразовые сеансы с другими функциями PowerShell. Упростите управление ИТ и автоматизацию, чтобы сэкономить время и снизить ручное вмешательство.

Source:
https://adamtheautomator.com/powershell-reusable-sessions/