Como Executar Comandos Usando o PowerShell Remoting

  1. O que é Acesso Remoto do PowerShell
  2. Configurar Ouvintes WinRM no PowerShell
  3. Criar uma Nova Sessão PowerShell
  4. Usar Métodos Invoke para Executar Comandos Rápidos Remotamente no PowerShell
Como Executar Comandos Usando o PowerShell Remoting

Com o Windows PowerShell, existem várias maneiras de executar um comando em computadores locais ou remotos. Uma maneira é habilitar o acesso remoto do PowerShell e usar os comandos de sessão do PowerShell.

Este artigo discutirá como o acesso remoto do PowerShell funciona, configurando WinRM, alguns exemplos de comandos de sessão do PowerShell e como podemos acessar um computador remotamente com acesso de administrador.

O que é Acesso Remoto do PowerShell

O Acesso Remoto do PowerShell (ou PSRemoting) é um dos recursos mais utilizados no PowerShell. Como resultado, podemos nos conectar facilmente a um ou mais computadores remotos e executar comandos usando um único comando.

Em resumo, PSRemoting nos permite executar comandos em computadores remotos como se estivéssemos sentados na frente deles. Além disso, PSRemoting fornece recursos que conectam e autenticam um usuário, executam cmdlets remotos e exibem qualquer saída desse cmdlet no computador local.

Pense em PSRemoting como SSH ou telnet ou até mesmo psexec. É apenas uma maneira de executar comandos em computadores dentro do PowerShell.

PSRemoting depende fortemente da execução de comandos em uma sessão. Uma sessão é um shell remoto que executa comandos internamente.

Criar uma dessas sessões passa por muitas etapas nos bastidores do console do PowerShell.

Quando iniciamos uma sessão PSRemoting, os seguintes passos gerais são realizados:

  1. O usuário tenta se conectar ao servidor de destino em um ouvinte do WinRM. O ouvinte do WinRM é um pequeno serviço web que roda em um servidor.

    WinRM é a versão da Microsoft de um padrão de implementação chamado WSMan. WSMan é um padrão de código aberto criado com muitas outras grandes empresas de tecnologia na época, como Intel, Dell e Sun Microsystems.

  2. O processo de autenticação começa quando o cliente se conecta ao ouvinte por meio do protocolo HTTP ou HTTPS.

  3. Após o cliente se conectar e autenticar no servidor, PSRemoting gera uma sessão.

  4. Depois que o PSRemoting gera a sessão, ela fica aberta para uso. O cliente pode começar a enviar informações ao servidor, retornando qualquer saída necessária conhecida como serialização.

    Essa comunicação é tipicamente criptografada.

Para habilitar PSRemoting, digite o comando abaixo em seu console PowerShell.

Enable-PSRemoting Force

Configurar Ouvintes WinRM no PowerShell

Um cliente precisa de um lugar para se conectar pela rede. O cliente precisa “falar” com algo que está “ouvindo” do outro lado; a parte “ouvindo” é o papel do ouvinte WinRM.

Você pode descobrir todos os ouvintes WinRM em execução em qualquer computador Windows usando o comando winrm abaixo.

winrm e winrm/config/listener

Os ouvintes WinRM têm alguns componentes essenciais.

  1. Endereço de escuta – O endereço IP ao qual eles estão vinculados. O endereço de escuta é o endereço IP do servidor ao qual o cliente se conecta.
  2. Tipo de transporte – Cada ouvinte WinRM precisa de uma maneira de se comunicar com o cliente; eles fazem isso por meio de transporte usando HTTP ou HTTPS.
  3. Impressão digital de certificado opcional – Se um ouvinte WinRM usar HTTPS para transporte, ele deve saber qual chave privada usar para autenticar o cliente; essa chave é encontrada utilizando uma impressão digital de certificado.

Para adicionar um computador remoto a uma lista de hosts confiáveis para o computador local no WinRM, digite o seguinte comando abaixo.

winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'

Para verificar e checar a configuração do WinRM, digite o seguinte comando abaixo.

winrm quickconfig

Criar uma Nova Sessão PowerShell

O comando New-PSSession cria uma sessão do Windows PowerShell (PSSession) em um computador local ou remoto. Ao criar uma PSSession, o PowerShell estabelece uma conexão persistente com o computador remoto.

Podemos executar comandos em um computador remoto sem criar uma PSSession usando os parâmetros –ComputerName do Enter-PSSession ou Invoke-Command.

Quando você usa o parâmetro –ComputerName, o PowerShell cria uma conexão temporária usada para o cmdlet e é então fechada posteriormente.

A partir do Windows PowerShell 6.0, podemos usar o Secure Shell (SSH) para criar e estabelecer uma sessão em uma máquina remota se o SSH estiver habilitado no computador local e o computador remoto estiver configurado com um ponto de extremidade SSH do Windows PowerShell.

Um dos benefícios de uma sessão remota iniciada baseada em SSH do Windows PowerShell é que ela pode funcionar em várias plataformas (Windows, Linux, macOS) ou de forma multiplataforma.

Para sessões baseadas em SSH, podemos usar os parâmetros -HostName ou -SSHConnection para especificar o computador remoto e outras informações de conexão relevantes.

New-PSSession -ComputerName DC01 -Credential (Get-Credential)

Lembre-se de que a sessão gerada pelo comando New-PSSession é persistente. Isso significa que podemos usá-la várias vezes.

No entanto, devemos nos lembrar que devemos fechar a sessão após usar o comando Remove-PSSession para evitar riscos de segurança.

Usar Métodos Invoke para Executar Comandos Rápidos Remotamente no PowerShell

O cmdlet Invoke-Command é preferível se escrevermos os comandos executados agora, pois mantemos o IntelliSense em nosso IDE. Além disso, Invoke-Command é vantajoso se executarmos comandos rápidos e fáceis, de uso único.

A sessão de qualquer método Invoke é não persistente e não mantém nenhuma sessão que usuários mal-intencionados possam abusar.

O trecho abaixo é um exemplo de Invoke-Command que passa um nome de usuário e uma senha de string segura que permitirá a execução de comandos em nível de administrador.

Exemplo de Script:

$username = "Username"
$password = "Password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object { $secstr.AppendChar($_) }
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $secstr

Invoke-Command -ComputerName RemoteServer -ScriptBlock { Get-Process } -Credential $cred
Está gostando dos nossos tutoriais? Inscreva-se no DelftStack no YouTube para nos apoiar na criação de mais vídeos tutoriais de alta qualidade. Inscrever-se
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn