Automação e gerenciamento de máquinas virtuais usando PowerShell

Você pode usar o PowerShell Direct para executar o PowerShell arbitrário em uma máquina virtual do Windows 10 ou Windows Server Technical Preview partindo do seu host Hyper-V, independentemente da configuração de rede ou das configurações de gerenciamento remoto.

Maneiras de executar o PowerShell Direct:

  • Como uma sessão interativa: clique aqui para criar e sair de uma sessão interativa do PowerShell usando Enter-PSSession.
  • Como uma sessão de uso único para executar um único comando ou script: clique aqui para executar um script ou comando usando Invoke-Command.
  • Como uma sessão persistente (build 14280 e posterior): clique aqui para criar uma sessão persistente usando New-PSSession.
    Continue copiando um arquivo de e para a máquina virtual usando Copy-Item e desconecte-se com Remove-PSSession.

Requisitos

Requisitos do sistema operacional:

  • Host: Windows 10, Windows Server Technical Preview 2 ou posterior executando o Hyper-V.
  • Máquina virtual/convidado: Windows 10, Windows Server Technical Preview 2 ou posterior.

Se você estiver gerenciando máquinas virtuais mais antigas, use o VMConnect (Conexão com Máquina Virtual) ou configure uma rede virtual para a máquina virtual.

Requisitos de configuração:

  • A máquina virtual deve ser executada localmente no host.
  • A máquina virtual deve estar ativada e em execução com pelo menos um perfil do usuário configurado.
  • Você deve estar conectado ao computador host como um administrador do Hyper-V.
  • É necessário fornecer credenciais de usuário válidas para a máquina virtual.

Criar e sair de uma sessão interativa do PowerShell

A maneira mais fácil de executar comandos do PowerShell em uma máquina virtual é iniciar uma sessão interativa.

Quando a sessão é iniciada, os comandos digitados são executados em uma máquina virtual, exatamente como se você os digitasse diretamente na sessão do PowerShell na própria máquina virtual.

Para iniciar uma sessão interativa:

  1. No servidor do Hyper-V, abra o PowerShell como Administrador.

  2. Execute um dos seguintes comandos para criar uma sessão interativa usando o GUID ou o nome da máquina virtual:

    Enter-PSSession -VMName <VMName>
    Enter-PSSession -VMId <VMId>
    

    Forneça credenciais para a máquina virtual quando solicitado.

  3. Execute comandos na sua máquina virtual.

    Você deve ver o VMName como o prefixo para o prompt do PowerShell, conforme mostrado:

    [VMName]: PS C:\ >
    

    Qualquer comando executado será executado na sua máquina virtual. Para testar, você pode executar ipconfig ou hostname para se certificar de que esses comandos estão em execução na máquina virtual.

  4. Quando terminar, execute o seguinte comando para fechar a sessão:

    Exit-PSSession 
    

Observação: se a sessão não conectar, consulte a solução de problemas para encontrar as possíveis causas.

Para saber mais sobre esses cmdlets, consulte Enter-PSSession e Exit-PSSession.


Executar um script ou comando com Invoke-Command

O PowerShell Direct com Invoke-Command é perfeito para situações em que você precisa executar um comando ou um script em uma máquina virtual, mas não precisa continuar interagindo com a máquina virtual além desse ponto.

Para executar um único comando:

  1. No servidor do Hyper-V, abra o PowerShell como Administrador.

  2. Execute um dos seguintes comandos para criar uma sessão usando o GUID ou o nome da máquina virtual:

    Invoke-Command -VMName <VMName> -ScriptBlock { cmdlet } 
    Invoke-Command -VMId <VMId> -ScriptBlock { cmdlet }
    

    Forneça credenciais para a máquina virtual quando solicitado.

    O comando será executado na máquina virtual, se houver saída para o console, ela será impressa no console. A conexão será fechada automaticamente assim que o comando for executado.

Para executar um script:

  1. No servidor do Hyper-V, abra o PowerShell como Administrador.

  2. Execute um dos seguintes comandos para criar uma sessão usando o GUID ou o nome da máquina virtual:

    Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 
    Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1 
    

    Forneça credenciais para a máquina virtual quando solicitado.

    O script será executado na máquina virtual. A conexão será fechada automaticamente assim que o comando for executado.

Para saber mais sobre este cmdlet, consulte Invoke-Command.


Copiar arquivos com New-PSSession e Copy-Item

Observação: O PowerShell Direct dá suporte apenas a sessões persistentes nos builds 14280 e posteriores do Windows

As sessões persistentes do PowerShell são incrivelmente úteis ao escrever scripts que coordenam ações por um ou mais computadores remotos. Uma vez criadas, as sessões persistentes existem na tela de fundo até que você decida excluí-las. Isso significa que você pode consultar repetidamente a mesma sessão com Invoke-Command ou Enter-PSSession sem passar credenciais.

Pelo mesmo token, as sessões mantêm o estado. Já que as sessões persistentes persistirem, todas as variáveis criadas em uma sessão ou passadas para uma sessão serão preservadas em várias chamadas. Há várias ferramentas disponíveis para trabalhar com sessões persistentes. Para este exemplo, usaremos New-PSSession e Copy-Item para mover dados do host para uma máquina virtual e de uma máquina virtual para o host.

Para criar uma sessão e depois copiar os arquivos:

  1. No servidor do Hyper-V, abra o PowerShell como Administrador.

  2. Execute um dos seguintes comandos para criar uma sessão persistente do PowerShell para a máquina virtual usando New-PSSession.

    $s = New-PSSession -VMName <VMName> -Credential (Get-Credential)
    $s = New-PSSession -VMId <VMId> -Credential (Get-Credential)
    

    Forneça credenciais para a máquina virtual quando solicitado.

    Aviso:
    Há um bug em builds anteriores a 14500. Se as credenciais não forem especificadas explicitamente com sinalizador -Credential, o serviço no convidado falhará e precisará ser reiniciado. Se você se deparar com esse problema, as instruções de solução alternativa estarão disponíveis aqui.

  3. Copie um arquivo para a máquina virtual.

    Para copiar C:\host_path\data.txt para a máquina virtual do computador host, execute:

    Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
    
  4. Copie um arquivo de máquina virtual (para o host).

    Para copiar C:\guest_path\data.txt do host para a máquina virtual, execute:

    Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
    
  5. Pare a sessão persistente usando Remove-PSSession.

    Remove-PSSession $s
    

Solução de problemas

Há um pequeno conjunto de mensagens de erro comuns exibidas por meio do PowerShell Direct. Aqui estão as mais comuns, algumas causas e ferramentas para diagnosticar problemas.

Os parâmetros -VMName ou -VMID não existem

Problema:
Enter-PSSession, Invoke-Command ou New-PSSession não tem um parâmetro -VMName ou -VMId.

Possíveis causas:
O problema mais provável é que o PowerShell Direct não tem suporte pelo sistema operacional do host.

Você pode verificar seu build do Windows executando o seguinte comando:

[System.Environment]::OSVersion.Version

Caso você esteja executando um build com suporte, também é possível que sua versão do PowerShell não execute o PowerShell Direct. Para o PowerShell Direct e JEA, a versão principal deve ser 5 ou posterior.

Você pode verificar seu build de versão do PowerShell executando o seguinte comando:

$PSVersionTable.PSVersion

Erro: uma sessão remota pode ter sido encerrada

Observação:
Para Enter-PSSession entre builds do host 10240 e 12400, todos os erros abaixo foram relatados como “Uma sessão remota pode ter terminado”.

Mensagem de erro:

Enter-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

Possíveis causas:

  • A máquina virtual existe, mas não está em execução.
  • O SO convidado não dá suporte ao PowerShell Direct (veja os requisitos)
  • O PowerShell ainda não está disponível no convidado
    • O sistema operacional não concluiu a inicialização
    • O sistema operacional não pôde ser inicializado corretamente
    • Algum evento de tempo de inicialização necessita de entrada do usuário

Você pode usar o cmdlet Get-VM para verificar quais VMs estão sendo executadas no host.

Mensagem de erro:

New-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

Possíveis causas:

  • Um dos motivos listados acima, todos eles são igualmente aplicáveis para New-PSSession
  • Um bug nos builds atuais em que credenciais devem ser passadas explicitamente com -Credential. Quando isso acontece, todo o serviço trava no sistema operacional convidado e precisa ser reiniciado. Você pode verificar se a sessão ainda está disponível com Enter-PSSession.

Para contornar o problema de credencial, faça logon na máquina virtual usando o VMConnect, abra o PowerShell e reinicie o serviço de vmicvmsession usando o PowerShell a seguir:

Restart-Service -Name vmicvmsession

Erro: o conjunto de parâmetros não pode ser resolvido

Mensagem de erro:

Enter-PSSession : Parameter set cannot be resolved using the specified named parameters.

Possíveis causas:

  • -RunAsAdministrator não terá suporte quando se conectar com máquinas virtuais.

    Ao se conectar a um contêiner do Windows, o sinalizador -RunAsAdministrator permite conexões de Administrador sem credenciais explícitas. Como as máquinas virtuais não oferecem o acesso de administrador do host implícito, você precisará digitar as credenciais explicitamente.

As credenciais de administrador podem ser passadas para a máquina virtual com o parâmetro -Credential ou por inserção manual, quando solicitado.

Erro: a credencial é inválida.

Mensagem de erro:

Enter-PSSession : The credential is invalid.

Possíveis causas:

  • Não foi possível validar as credenciais do convidado
    • As credenciais fornecidas estavam incorretas.
    • Não há nenhuma conta de usuário no convidado (o SO ainda não foi inicializado antes)
    • Se estiver conectando-se como administrador: o administrador não foi definido como um usuário ativo. Saiba mais aqui.

Erro: o parâmetro de entrada VMName não é resolvido para qualquer máquina virtual.

Mensagem de erro:

Enter-PSSession : The input VMName parameter does not resolve to any virtual machine.

Possíveis causas:

  • Você não for um administrador do Hyper-V.
  • A máquina virtual não existe.

Você pode usar o cmdlet Get-VM para verificar se as credenciais usadas têm a função de administrador do Hyper-V e ver quais VMs estão sendo executadas localmente no host e foram inicializadas.


Exemplos e guias do usuário

O PowerShell Direct dá suporte a JEA (Just Enough Administration). Confira este guia do usuário para experimentá-lo.

Confira as amostras no GitHub.