O PowerShell Remoting é um dos recursos mais poderosos do PowerShell, permitindo que você execute comandos em computadores remotos como se estivesse localmente. Ele é baseado no WinRM (Windows Remote Management), que implementa o protocolo WS-Management. Com o remoting, você pode gerenciar centenas de servidores de forma centralizada, automatizar tarefas e coletar informações sem precisar acessar cada máquina individualmente.

Nesta aula, você vai dominar os principais cmdlets e técnicas para trabalhar com remoting, desde a conexão interativa até a execução de scripts em lote. Vamos explorar também a configuração do WinRM e boas práticas de segurança.

Enter-PSSession

O cmdlet Enter-PSSession inicia uma sessão interativa com um computador remoto. Quando você o usa, o prompt do PowerShell muda para indicar que está conectado à máquina remota, e todos os comandos que você digitar serão executados nela. É como um SSH para o PowerShell.

Para usar, basta especificar o nome do computador ou endereço IP. Por padrão, a autenticação é baseada no usuário atual, mas você pode fornecer credenciais diferentes com o parâmetro -Credential. A sessão permanece ativa até que você digite Exit-PSSession.

# Entrar em uma sessão interativa com o servidor 'SRV01'
Enter-PSSession -ComputerName SRV01

# Agora você está em SRV01. Execute comandos:
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5

# Para sair:
Exit-PSSession

É importante notar que Enter-PSSession é útil para tarefas administrativas rápidas, mas não é recomendado para automação em larga escala, pois cada comando é executado individualmente, o que pode ser lento. Para scripts e execução em massa, use Invoke-Command.

Invoke-Command

O cmdlet Invoke-Command é a ferramenta principal para executar comandos em um ou vários computadores remotos de forma não interativa. Ele envia um bloco de script para a máquina remota, executa-o e retorna os resultados para a sua sessão local. Isso é muito mais eficiente do que Enter-PSSession para automação.

Você pode especificar vários computadores, e o PowerShell executa o comando em paralelo (dentro de limites). O parâmetro -ComputerName aceita uma matriz de nomes. Também é possível usar -Session para reutilizar sessões persistentes, o que reduz a sobrecarga de conexão.

# Executar um comando em um único computador
Invoke-Command -ComputerName SRV01 -ScriptBlock { Get-Service -Name Spooler }

# Executar em vários computadores
Invoke-Command -ComputerName SRV01, SRV02, SRV03 -ScriptBlock { Get-Process }

# Usando sessão persistente
$session = New-PSSession -ComputerName SRV01
Invoke-Command -Session $session -ScriptBlock { Get-EventLog -LogName System -Newest 10 }
Remove-PSSession $session

Uma característica poderosa do Invoke-Command é a capacidade de passar parâmetros para o script block usando -ArgumentList. Isso permite criar scripts mais flexíveis e reutilizáveis.

$computers = 'SRV01', 'SRV02'
$script = {
    param($ServiceName)
    Get-Service -Name $ServiceName | Select-Object MachineName, Status, Name
}
Invoke-Command -ComputerName $computers -ScriptBlock $script -ArgumentList 'Spooler'

WinRM (visão geral)

O WinRM (Windows Remote Management) é a implementação da Microsoft do protocolo WS-Management. Ele é a base do PowerShell Remoting, permitindo a comunicação entre máquinas Windows usando HTTP ou HTTPS. Para que o remoting funcione, o serviço WinRM deve estar em execução e configurado corretamente em todos os computadores envolvidos.

A configuração básica do WinRM pode ser feita com o cmdlet Enable-PSRemoting, que inicia o serviço, define o firewall e cria as regras necessárias. Em ambientes corporativos, o WinRM é frequentemente configurado via Política de Grupo para garantir consistência.

# Habilitar o PowerShell Remoting (executar como administrador)
Enable-PSRemoting -Force

# Verificar a configuração do WinRM
Get-Service WinRM
winrm quickconfig

O WinRM também suporta autenticação Kerberos, NTLM e certificados. Para conexões HTTPS, é necessário configurar um certificado e ajustar os listeners. A segurança é um aspecto crítico: você deve limitar quais usuários podem se conectar e usar apenas redes confiáveis.

Casos de uso

O PowerShell Remoting é amplamente utilizado em administração de sistemas e automação. Aqui estão alguns cenários comuns:

  • Gerenciamento em massa: Aplicar atualizações, configurar serviços ou coletar informações de dezenas de servidores em um único comando.
  • Automação de tarefas: Executar scripts complexos que precisam ser executados em várias máquinas, como deploy de aplicações ou rotinas de backup.
  • Suporte remoto: Diagnosticar problemas em estações de trabalho sem precisar de acesso físico.
  • Integração com CI/CD: Executar comandos em máquinas de build ou teste durante pipelines de integração contínua.

Um exemplo prático: coletar o uso de disco de todos os servidores de uma filial e salvar em um relatório.

$servers = 'SRV01', 'SRV02', 'SRV03'
$report = Invoke-Command -ComputerName $servers -ScriptBlock {
    Get-PSDrive -PSProvider FileSystem |
        Select-Object @{Name='Servidor'; Expression={$env:COMPUTERNAME}},
                      @{Name='Unidade'; Expression={$_.Name}},
                      @{Name='EspaçoLivre(GB)'; Expression={[math]::Round($_.Free/1GB,2)}}
}
$report | Export-Csv -Path 'C:\Temp\relatorio_disco.csv' -NoTypeInformation

Outro caso é usar Invoke-Command para reiniciar serviços em vários servidores de uma vez, economizando tempo e evitando erros manuais.

Boas práticas

  • Use sessões persistentes quando for executar múltiplos comandos no mesmo computador, pois reduz a sobrecarga de autenticação.
  • Limite o uso de Enter-PSSession para tarefas interativas; em scripts, prefira Invoke-Command.
  • Configure a autenticação adequada (Kerberos em domínios, HTTPS para ambientes não confiáveis).
  • Teste em um ambiente de desenvolvimento antes de executar em produção.
  • Monitore e registre as sessões remotas para auditoria de segurança.

Referências

Exercícios

  1. Exercício 1: Qual é a diferença fundamental entre Enter-PSSession e Invoke-Command? Dê um exemplo de quando usar cada um.
  2. ✓ Resposta: Enter-PSSession cria uma sessão interativa onde você digita comandos diretamente na máquina remota, como um terminal remoto. É útil para tarefas manuais e diagnósticos. Invoke-Command executa um script ou comando em uma ou mais máquinas remotas de forma não interativa e retorna os resultados, sendo ideal para automação e execução em massa.
  3. Exercício 2: Escreva um comando Invoke-Command que execute Get-Process nos computadores 'PC1' e 'PC2' e exiba o nome do processo e o uso de CPU.
  4. ✓ Resposta:
    Invoke-Command -ComputerName PC1, PC2 -ScriptBlock { Get-Process | Select-Object Name, CPU }
  5. Exercício 3: Como você verifica se o WinRM está habilitado em um computador local? E como habilitá-lo?
  6. ✓ Resposta: Para verificar, use Get-Service WinRM ou Test-WSMan. Para habilitar, execute Enable-PSRemoting -Force como administrador.
  7. Exercício 4: Crie uma sessão persistente para o computador 'SRV01' e use-a para executar dois comandos diferentes. Não se esqueça de remover a sessão após o uso.
  8. ✓ Resposta:
    $session = New-PSSession -ComputerName SRV01
    Invoke-Command -Session $session -ScriptBlock { Get-Service }
    Invoke-Command -Session $session -ScriptBlock { Get-EventLog -LogName System -Newest 5 }
    Remove-PSSession $session
  9. Exercício 5: Explique por que é recomendado usar sessões persistentes em vez de criar uma nova conexão para cada comando, especialmente quando você executa muitos comandos em uma mesma máquina.
  10. ✓ Resposta: Sessões persistentes reutilizam a conexão e o contexto de autenticação, reduzindo a sobrecarga de criar uma nova sessão a cada comando. Isso melhora a performance e permite manter estado entre comandos (por exemplo, variáveis). Além disso, é mais eficiente em termos de recursos e tempo.