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/