Acesso remoto com PowerShell

Publicado: 22 de novembro de 2009 em PowerShell
Tags:

Ae galera, estou estudando o PS a fundo. Em várias fontes que li, apenas mostra como executar comandos PS em máquinas remotas que estão na mesma rede. O comando é mais ou menos assim ( para o caso de informações sobre discos lógicos ). Farei alguns comentários no código para melhor entendimento. O “#” é o indicador de comentário do PS

clear-host #mesma coisa que cls
Get-WmiObject “win32_logicaldisk” -ComputerName “NomeOuIPdaMáquinaRemota” #retorna um objeto WMI com informações dos discos lógicos

No entanto, se você estiver em uma VPN ou numa rede que seu usuário do Windows não possui acesso às máquinas, o script acima vai gerar o seguinte erro

Acesso negado. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
At :line:1 char:13
+ Get-WmiObject <<<<  “win32_logicaldisk” -ComputerName “NomeOuIPdaMáquinaRemota”

Pois é necessário indicar o usuário e senha para acesso ao PC remoto. Daí muitos blogs, livros, etc postam o seguinte código:

clear-host
$cred = Get-Credential “Domínio\usuario ou apenas usuário” #retorna um objeto com as credenciais do usuário
Get-WmiObject “win32_logicaldisk” -ComputerName “NomeOuIPdaMáquinaRemota” -Credential $cred

Agora sim, passo o usuário e o PS consegue acessar o PC remoto tranquilamento ok?

Não. A Microsoft, nos seus novos produtos, adotou os procedimentos de “Defaul Protected” ( Seguro por Padrão ). Logo, o PS não permite que os programadores informem a senha nos scripts. Com isso, o script acima funciona sim, no entanto, o Windows Abre uma tela para que o executor do script acima informe a senha do usuário.

Imagine que você precise executar um script desses acima em 200 máquinas? Ao menos na primeira vez, você teria que especificar a senha 200 vezes. Isso não é nada elegante.

Posso salvar as credenciais de usuários em arquivos criptografados e depois passar essas credenciais via PS. Para isso, usei o pass through authentication, fiquei sabendo que se tenho o mesmo usuário nas 200 máquinas com a mesma senha, quando logo na primeira máquina tenho acesso à todas as outras ). Com isso, precisei apenas salvar uma credencial. Segue script abaixo:

clear-host
$cred=get-credential “nomeDaMaquina”
$cred.password | ConvertFrom-SecureString | Set-Content c:\nomeDoArquivoASerGravadaACredencial.txt

O Script acima salva as informações das credenciais informadas pelo usuário ( o Windows abre uma tela para que o programador informe user e senha )

Uma vez criada a credencial, podemos usá-la quantas quisermos em nossos scripts. Veja abaixo:

$pw = Get-Content c:\nomeDoArquivoASerGravadaACredencial.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential(“userName”, $pw) #onde userName é o usuário informado no script acima

Get-WmiObject Win32_logicaldisk -computername “nomeDaMaquina” -Credential $cred #onde -computername é o mesmo do script acima.

Agora sim, podemos executar o script via agendador de tarefas sem qualquer intervenção do usuário.

Espero que a dica tenha sido útil.

Abraços

Demétrio Silva

Anúncios
comentários
  1. Laerte disse:

    Perfeito Demétrio. È muito dificil encontrar exemplos reais com este. A maoria é bem simples e não mostra as dificuldade que temos !!!!.. Ótimo artigo meu amigo !!!

  2. para mim não funcionou aqui.
    este script eu rodo no power shell, certo?
    ele pede usuário e senha. Se subistituir “nomeDaMaquina”, isso coloca o nome do computador onde estou rodando o script no campo nome do textbox.
    Não entendi onde ele passa a senha da credencial.

    clear-host
    $cred=get-credential “nomeDaMaquina”
    $cred.password | ConvertFrom-SecureString | Set-Content c:\nomeDoArquivoASerGravadaACredencial.txt

    Este script eu coloquei acima de meu codigo que é acesso ao sql de varios servidores para monitoramento.
    O local “username” é para colocar o usuário, mas qual usuário informado?

    $pw = Get-Content c:\nomeDoArquivoASerGravadaACredencial.txt | ConvertTo-SecureString
    $cred = New-Object System.Management.Automation.PsCredential(“userName”, $pw) #onde userName é o usuário informado no script acima

    Get-WmiObject Win32_logicaldisk -computername “nomeDaMaquina” -Credential $cred #onde -computername é o mesmo do script acima.

    os valores são passados dentro de aspas, ou não?

    • Olá Hudson,

      Quando você executa o comando:

      clear-host
      $cred=get-credential “nomeDaMaquina”

      O próprio Windows abre uma janela para você informar a credencial.

      O local “username” é para colocar o usuário, mas qual usuário informado?

      R: O usuário informado na janela Popup que o Windows abre ao executar o comando $cred=get-credential “nomeDaMaquina”. Lembre de usar sempre aspas duplas. As vezes o site formata (troca) “” por “”, onde o correto é “”

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s