Sessões Reutilizáveis no PowerShell: Um Guia para Conexões Remotas Persistentes

Gerenciar sistemas remotos pode rapidamente se tornar uma dor de cabeça, especialmente ao executar vários comandos em máquinas diferentes. O vai e vem constante de reconectar aos sistemas pode desperdiçar tempo e atrasar seu fluxo de trabalho. Isso soa familiar? Não se preocupe, há uma maneira melhor!

Neste guia, você aprenderá a usar sessões de remoção do PowerShell reutilizáveis para tornar o gerenciamento de sistemas remotos mais rápido, fácil e eficiente.

Pronto para aprimorar suas habilidades de remoção do PowerShell? Vamos lá!

Criando e Utilizando uma Sessão

Ao trabalhar com sistemas remotos, uma das tarefas mais tediosas pode ser reconectar a eles cada vez que você executa um comando. Nesses casos, as sessões reutilizáveis entram em ação.

Criar uma sessão persistente mantém uma conexão contínua. Fazendo isso, elimina a necessidade de conectar e desconectar enquanto você executa múltiplos comandos repetidamente.

Para começar, você precisará criar uma sessão reutilizável.

O cmdlet New-PSSession estabelece uma conexão persistente com o computador remoto:

$session = New-PSSession -ComputerName SRV2

Este objeto de sessão pode ser passado para comandos como Invoke-Command, permitindo que você reutilize a mesma sessão ao longo do seu script.

Por exemplo, você pode testar a conexão executando um comando básico:

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

Uma sessão reutilizável também permite que você armazene e recupere variáveis no sistema remoto:

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

Esta capacidade de armazenamento persistente é uma vantagem significativa das sessões reutilizáveis, permitindo que você mantenha o estado através de múltiplos comandos.

Adaptando a Função para Uso Remoto

Vamos adaptar a função de inventário para funcionar com sessões reutilizáveis.

Primeiro, adicionamos um parâmetro Sessão para aceitar um objeto de sessão, onde o cmdlet Get-Member ajuda a identificar o tipo de objeto de sessão:

$session | Get-Member

Ao identificar que o objeto de sessão é do tipo System.Management.Automation.Runspaces.PSSession, o próximo passo é definir a função Get-WmiObjectValue.

Esta função usa o parâmetro de sessão para permitir a execução remota, permitindo que ela execute um bloco de script no sistema remoto e recupere uma propriedade WMI específica.

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
}

Vamos testar esta função e ver o que acontece.

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

Você vai encontrar esse erro em algum momento. Mas não se preocupe. Continue lendo e você aprenderá como resolver esse erro.

Resolvendo Problemas de Autenticação.

Se você encontrar erros de “Acesso Negado”, provavelmente é devido a permissões insuficientes. Por padrão, sessões reutilizáveis herdam as credenciais usadas para criá-las.

Verifique o nome de usuário atualmente autenticado no sistema:

whoami

Se o usuário de domínio, chamado usuário, não tiver permissão para consultar o WMI no computador remoto, eleve o Invoke-Command para usar uma conta de administrador.

Primeiro, crie um objeto de credencial com o cmdlet Get-Credential para especificar credenciais alternativas ao criar a sessão:

$adminCred = Get-Credential -UserName adam

Depois de autenticado, teste a sessão:

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

Este teste garante que a sessão funcione como esperado antes de executar sua função de inventário.

Mas se a sessão não funcionou, ela já foi criada com credenciais incorretas. Se for o caso, você deve remover a sessão atual:

Remove-PSSession -Session $session

A cmdlet Remove-PSSession remove a sessão tanto nos computadores locais quanto remotos.

Com a sessão antiga removida, crie outra nova sessão. Mas desta vez, crie a sessão autenticada como o usuário admin:

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

Tente o Invoke-Command novamente usando a nova sessão e veja o que acontece.

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

Agora que você está confiante de que a nova sessão funciona, vamos tentar a função novamente.

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

Juntando Tudo

O trabalho duro acabou, e é hora de combinar tudo em um único script.

Este script final coleta informações de inventário, exibe os resultados e limpa a sessão:

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

Salve e execute o script (Get-InventoryInfo.ps1) para verificar se funciona como pretendido.

Conclusão

Neste tutorial, você aprendeu a construir uma função robusta que utiliza sessões reutilizáveis para gerenciar computadores remotos de forma eficaz. Agora você sabe como manter uma conexão persistente entre vários comandos e executar tarefas complexas em sistemas remotos sem desconectar a cada vez.

Avançando, você pode expandir esse conhecimento incorporando sessões reutilizáveis em fluxos de trabalho de automação maiores. Um exemplo seria expandir a função de inventário para coletar métricas adicionais do sistema ou automatizar tarefas de manutenção em várias máquinas remotas.

Combine sessões reutilizáveis com outros recursos do PowerShell. Otimize seus esforços de gerenciamento de TI e automação para economizar tempo e reduzir a intervenção manual.

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