Sessões remotas
Nesta aula, você aprenderá a criar e gerenciar sessões remotas persistentes com o PowerShell, utilizando o cmdlet New-PSSession. Exploraremos como executar comandos em múltiplas máquinas de forma eficiente e as boas práticas para uso seguro e produtivo dessas sessões.
As sessões remotas são um dos recursos mais poderosos do PowerShell, permitindo que você execute comandos em computadores remotos de forma centralizada. Nesta aula, vamos nos aprofundar no cmdlet New-PSSession, que cria sessões persistentes, e explorar como utilizá-las para administrar várias máquinas de uma só vez.
Diferente do cmdlet Invoke-Command, que cria uma sessão temporária e a descarta após a execução, uma sessão persistente mantém o estado entre comandos, permitindo que você reutilize variáveis, módulos e até mesmo funções definidas durante a sessão. Isso é particularmente útil em tarefas de automação complexas ou quando você precisa executar uma sequência de comandos que dependem uns dos outros.
New-PSSession
O cmdlet New-PSSession é responsável por criar uma nova sessão remota. Ele estabelece uma conexão com um computador remoto e retorna um objeto de sessão que você pode armazenar em uma variável para uso posterior. A sintaxe básica é:
New-PSSession -ComputerName Servidor01Por padrão, ele usa o protocolo WinRM e as credenciais do usuário atual. Você pode especificar um usuário diferente com o parâmetro -Credential:
$cred = Get-Credential
New-PSSession -ComputerName Servidor01 -Credential $credAlém disso, é possível criar várias sessões de uma vez, passando uma lista de computadores:
$computadores = 'Servidor01', 'Servidor02', 'Servidor03'
$sessoes = New-PSSession -ComputerName $computadoresIsso retorna um array de sessões que podem ser gerenciadas em conjunto. Você também pode usar o parâmetro -Session em cmdlets como Invoke-Command para executar comandos na sessão persistente.
Sessões persistentes
Uma sessão persistente mantém o estado entre execuções de comandos. Isso significa que, se você definir uma variável em uma sessão, ela estará disponível na próxima vez que usar a mesma sessão. Por exemplo:
$sessao = New-PSSession -ComputerName Servidor01
Invoke-Command -Session $sessao -ScriptBlock { $x = 10 }
Invoke-Command -Session $sessao -ScriptBlock { $x } # Retorna 10Isso é extremamente útil para tarefas que exigem múltiplas etapas, como configurar um serviço e depois verificar seu status. Além disso, módulos carregados na sessão permanecem disponíveis, economizando tempo de carregamento em comandos subsequentes.
Para encerrar uma sessão persistente, use Remove-PSSession:
Remove-PSSession -Session $sessaoSe você não remover, a sessão ficará ativa até que o processo do PowerShell seja encerrado ou o tempo limite de ociosidade seja atingido (configurável).
Executando em múltiplas máquinas
Uma das principais vantagens das sessões persistentes é a capacidade de executar comandos em paralelo em várias máquinas. Você pode criar sessões para todos os computadores de um domínio e depois usar Invoke-Command para executar comandos em todas elas simultaneamente:
$sessoes = New-PSSession -ComputerName Servidor01, Servidor02, Servidor03
Invoke-Command -Session $sessoes -ScriptBlock { Get-Service -Name 'Spooler' }O PowerShell distribui automaticamente os comandos entre as sessões e coleta os resultados. Você pode processar os resultados individualmente, por exemplo, verificando o status de cada máquina:
$resultados = Invoke-Command -Session $sessoes -ScriptBlock { Get-Service -Name 'Spooler' }
$resultados | ForEach-Object { Write-Host "$($_.PSComputerName): $($_.Status)" }Isso torna a administração de múltiplos servidores muito mais eficiente, pois você pode executar diagnósticos ou aplicar configurações em lote sem precisar acessar cada máquina individualmente.
Boas práticas
Ao trabalhar com sessões remotas, algumas boas práticas podem melhorar a segurança e a eficiência:
- Use credenciais específicas: Sempre que possível, forneça credenciais com privilégios mínimos necessários para a tarefa, evitando o uso de contas de administrador global.
- Limite o escopo: Execute apenas os comandos necessários na sessão remota, reduzindo a superfície de ataque e o impacto de erros.
- Gerencie o ciclo de vida: Sempre remova as sessões após o uso com
Remove-PSSessionpara liberar recursos e evitar conexões órfãs. - Trate erros: Use blocos
try/catchem seus scripts para lidar com falhas de conexão ou execução, garantindo que seus scripts sejam robustos. - Use configurações de WinRM: Verifique se o WinRM está configurado corretamente nos computadores alvo, incluindo o serviço e as regras de firewall.
Além disso, considere usar o parâmetro -ThrottleLimit em Invoke-Command para controlar o número de conexões simultâneas, evitando sobrecarregar a rede ou os servidores.
Referências
- Documentação oficial do New-PSSession (Microsoft)
- Executando comandos remotos no PowerShell (Microsoft)
- Documentação do Invoke-Command
- Considerações de segurança do WinRM (Microsoft)
- Windows Remote Management (WinRM) - visão geral
- Documentação do Remove-PSSession
Exercícios
- Exercício 1: Crie uma sessão persistente para o computador 'localhost' e execute um comando que retorne o nome do sistema operacional. Em seguida, remova a sessão corretamente.✓ Resposta:
$sessao = New-PSSession -ComputerName localhost Invoke-Command -Session $sessao -ScriptBlock { [System.Environment]::OSVersion.VersionString } Remove-PSSession -Session $sessao - Exercício 2: Crie sessões para três computadores ('Servidor01', 'Servidor02', 'Servidor03') e execute o cmdlet
Get-Processem todas elas. Exiba o nome do processo e o nome do computador para cada resultado.✓ Resposta:$sessoes = New-PSSession -ComputerName Servidor01, Servidor02, Servidor03 $resultados = Invoke-Command -Session $sessoes -ScriptBlock { Get-Process } $resultados | ForEach-Object { Write-Host "$($_.PSComputerName): $($_.ProcessName)" } Remove-PSSession -Session $sessoes - Exercício 3: Explique por que uma variável definida dentro de uma sessão persistente está disponível em comandos subsequentes, mas não em uma nova sessão.✓ Resposta: Uma sessão persistente mantém o estado da sessão (variáveis, módulos, etc.) no computador remoto. Quando você executa um comando com
Invoke-Command -Session, ele reutiliza a mesma sessão, portanto o estado é preservado. Em uma nova sessão, o estado é zerado, pois cada sessão é independente. - Exercício 4: Escreva um script que crie sessões para todos os computadores em um arquivo de texto chamado 'computadores.txt' (um por linha), execute o comando
Get-Service -Name 'Spooler'em cada um e, ao final, remova todas as sessões.✓ Resposta:$computadores = Get-Content -Path 'computadores.txt' $sessoes = New-PSSession -ComputerName $computadores $resultados = Invoke-Command -Session $sessoes -ScriptBlock { Get-Service -Name 'Spooler' } $resultados | Format-Table PSComputerName, Status Remove-PSSession -Session $sessoes - Exercício 5: Liste três boas práticas ao usar sessões remotas e explique a importância de cada uma.✓ Resposta: 1) Usar credenciais com privilégios mínimos: reduz o risco de comprometimento se a sessão for interceptada. 2) Remover sessões após o uso: evita acúmulo de conexões e libera recursos. 3) Tratar erros com try/catch: garante que o script não falhe silenciosamente, facilitando o diagnóstico.
Observações finais
As sessões remotas são fundamentais para administração centralizada e automação em ambientes com múltiplos servidores. Dominar o New-PSSession e saber gerenciar sessões persistentes permitirá que você execute tarefas complexas de forma eficiente e segura. Lembre-se de sempre validar a configuração do WinRM e testar em um ambiente controlado antes de aplicar em produção.