Gerenciar sistemas remotos pode rapidamente se tornar uma dor de cabeça, especialmente ao executar vários comandos em máquinas diferentes. O constante vai e vem de reconexão aos sistemas pode desperdiçar tempo e reduzir a eficiência do 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 a gestão de sistemas remotos mais rápida, 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. Nestes casos, as sessões reutilizáveis entram em jogo.
Criar uma sessão persistente mantém uma conexão contínua. Fazendo isso, elimina a necessidade de conectar e desconectar ao executar 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 trabalhar com sessões reutilizáveis.
Primeiro, adicionamos um parâmetro Session
para aceitar um objeto de sessão, onde o cmdlet Get-Member
ajuda a identificar o tipo do objeto de sessão:
$session | Get-Member
Após identificar que o objeto de sessão é do tipo System.Management.Automation.Runspaces.PSSession
, o próximo passo é definir a função Get-WmiObjectValue
.
Essa função usa o parâmetro de sessão para permitir a execução remota, possibilitando a execução de um bloco de script no sistema remoto e a recuperação de 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 essa função e ver o que acontece.
Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
Você encontrará esse erro em algum momento. Mas não se preocupe. Continue lendo e você aprenderá como resolver esse erro.
Abordando Problemas de Autenticação
Se você encontrar erros de “Acesso Negado”, é provável que seja 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 do usuário autenticado atualmente no sistema:
whoami
Se o usuário do domínio, chamado user, não tiver permissão para consultar 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
Uma vez autenticado, teste a sessão:
Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred
Esse teste garante que a sessão funcione conforme o 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
O cmdlet Remove-PSSession
remove a sessão em ambos os computadores local e remoto.
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 árduo acabou e é hora de combinar tudo em um único script.
Este script final reúne 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 ele funciona conforme o esperado.
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 através de vários comandos e executar tarefas complexas em sistemas remotos sem desconectar a cada vez.
Olhando para o futuro, 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 outras funcionalidades do PowerShell. Otimize seus esforços de gerenciamento de TI e automação para economizar tempo e reduzir intervenções manuais.
Source:
https://adamtheautomator.com/powershell-reusable-sessions/