HOWTO · PowerShell

Como Executar Comandos Usando o PowerShell Remoting

Aprenda como funciona o PowerShell Remoting, configure e verifique o WinRM, crie e reutilize uma PSSession e execute comandos pontuais com Invoke-Command.

Nesta página

O PowerShell Remoting permite executar comandos em outro computador por meio de um ponto de extremidade de acesso remoto configurado. Use New-PSSession quando vários comandos precisarem compartilhar o mesmo estado remoto; use Invoke-Command com -ComputerName para uma tarefa que não exija uma sessão reutilizável. Os comandos abaixo são modelos: substitua DC01 por um host que você tenha autorização para administrar e execute os comandos de configuração em uma janela do PowerShell com os privilégios adequados.

O que o PowerShell Remoting faz

Em uma conexão com WinRM, o cliente acessa um listener no computador remoto, autentica-se e executa o comando solicitado em uma sessão remota. O PowerShell retorna os resultados ao cliente; muitos objetos atravessam a conexão como representações serializadas e, por isso, podem não manter todos os comportamentos do objeto original em tempo real. A comunicação de acesso remoto é protegida conforme a configuração do transporte e da autenticação. Não presuma que toda conexão usa HTTPS: WinRM costuma usar HTTP com proteção no nível da mensagem para métodos de autenticação compatíveis, enquanto HTTPS usa TLS na camada de transporte. As orientações de segurança da Microsoft para WinRM descrevem como a autenticação e o transporte afetam essa proteção.

O ponto de extremidade remoto determina quais comandos e permissões estão disponíveis. Uma conexão bem-sucedida não concede automaticamente direitos de administrador; a conta fornecida precisa ter autorização para acessar o ponto de extremidade e executar a operação solicitada.

Habilitar e verificar WinRM

Em um computador Windows que aceitar conexões de WinRM, um administrador pode configurar o acesso remoto com Enable-PSRemoting -Force. Antes de alterar um computador gerenciado, avalie os efeitos e as políticas da sua organização. Para inspecionar os listeners configurados, execute winrm enumerate winrm/config/listener em um prompt de comando ou no PowerShell. Os detalhes dos listeners identificam o transporte e os endereços nos quais WinRM aceita conexões. winrm quickconfig pode informar ou configurar as definições básicas do serviço e dos listeners de WinRM; ele não substitui a verificação das regras do firewall, das permissões do ponto de extremidade e da conectividade de rede.

Use HTTPS quando seu ambiente exigir transporte TLS e tiver um certificado e um listener HTTPS configurados corretamente. O uso de HTTP não significa que todo o tráfego de acesso remoto seja enviado sem proteção: WinRM aplica criptografia no nível da mensagem, após a autenticação, para métodos de autenticação compatíveis. A proteção exata depende do método de autenticação e da configuração; siga os requisitos de segurança da sua organização e consulte as orientações de segurança da Microsoft para WinRM para conhecer as ressalvas documentadas.

TrustedHosts é uma configuração do lado do cliente que pode ser relevante em grupos de trabalho ou em outras configurações nas quais o cliente não consegue autenticar o servidor da maneira habitual, baseada em domínio. Ela não é uma solução universal para problemas de conexão e não torna seguro um servidor não confiável. As orientações de segurança da Microsoft para WinRM explicam o contexto de autenticação e os cuidados necessários; quando possível, prefira uma configuração adequada baseada em domínio ou certificado. Se a política exigir TrustedHosts, restrinja a configuração a hosts conhecidos e use um método de autenticação aprovado. Você pode inspecioná-la com winrm get winrm/config/client e alterá-la somente depois de avaliar as implicações de segurança.

Criar e reutilizar uma PSSession

Crie uma sessão remota persistente informando o destino e as credenciais:

$credential = Get-Credential; $session = New-PSSession -ComputerName 'DC01' -Credential $credential

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

$result = 'Ready to run the remote task.'
$result
Ready to run the remote task.

O exemplo acima exibe uma cadeia de caracteres local e não se conecta a um computador remoto. Para estabelecer uma conexão de verdade, execute o comando em linha em uma sessão interativa do PowerShell; Get-Credential solicita as credenciais, em vez de inserir uma senha no código-fonte. A conta ainda precisa ter permissão para se conectar ao ponto de extremidade remoto. Depois de criar a sessão, passe o objeto da sessão aos comandos que devam compartilhar essa sessão remota e o estado dela. Por exemplo, use Invoke-Command -Session $session -ScriptBlock { Get-Service -Name 'Spooler' } para executar um comando nela. Uma sessão persistente é útil quando você precisa realizar várias operações remotas ou manter variáveis e outros dados de estado da sessão disponíveis entre chamadas.

Quando terminar, encerre a conexão e libere a sessão com Remove-PSSession $session. Se a criação falhar, verifique o nome do destino, o caminho de rede, o listener de WinRM, o firewall, as credenciais e as permissões do ponto de extremidade antes de alterar as configurações de confiança do cliente.

O PowerShell também pode usar acesso remoto por SSH quando a versão instalada do PowerShell, o cliente SSH, o serviço SSH remoto e o ponto de extremidade SSH configurado do PowerShell forem compatíveis. O guia da Microsoft sobre acesso remoto por SSH descreve os pré-requisitos e a configuração; consulte as orientações para as versões e o ponto de extremidade que você usa, pois o suporte depende desse ambiente. A referência de New-PSSession documenta formas de uso do SSH, como -HostName com -UserName e o parâmetro -SSHConnection para informar os detalhes da conexão. Essas opções não configuram o serviço SSH remoto nem o ponto de extremidade do PowerShell por você.

Executar comandos pontuais com Invoke-Command

Para uma única tarefa, Invoke-Command -ComputerName estabelece uma conexão para a chamada e retorna os resultados sem deixar um objeto de sessão para reutilização. Por exemplo, Invoke-Command -ComputerName 'DC01' -Credential (Get-Credential) -ScriptBlock { Get-Service -Name 'Spooler' } solicita as credenciais e consulta as informações do serviço no computador remoto. Use uma conta autorizada pelo ponto de extremidade; o acesso remoto não eleva os privilégios dessa conta.

A seguir está um exemplo local e autocontido de chamada de um bloco de script. Ele demonstra a forma de uso do comando com bloco de script sem se conectar a um computador remoto; ao trabalhar remotamente, substitua-o por uma chamada com -ComputerName configurado ou baseada em uma sessão:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

$result = Invoke-Command -ScriptBlock { 'Ready to run the remote task.' }
$result

Para operações remotas, as variáveis referenciadas dentro de um bloco de script são avaliadas no lado remoto. Quando apropriado, passe valores locais explicitamente com -ArgumentList e o escopo automático $using:, e evite inserir senhas diretamente no código-fonte. Use New-PSSession quando comandos posteriores precisarem compartilhar uma conexão persistente ou o estado de uma sessão remota.