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 Windows 10 ou superior, ou Windows Server 2016 ou mais recente, a partir do seu host Hyper-V. Use o PowerShell Direct independentemente da configuração de rede ou das configurações de gerenciamento remoto.

Estas são algumas maneiras de executar o PowerShell Direct:

Requisitos

Requisitos do sistema operacional:

  • Host: Windows 10, Windows Server 2016 ou posterior executando o Hyper-V.
  • Máquina virtual/convidado: Windows 10, Windows Server 2016 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ê deverá ver o VMName como o prefixo do prompt do PowerShell da seguinte forma:

    [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 { command } 
    Invoke-Command -VMId <VMId> -ScriptBlock { command }
    

    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. Neste 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 nas compilações 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ê encontrar esse problema, instruções de solução alternativa estão disponíveis na seção Erro: uma sessão remota pode ter terminado.

  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. As seções a seguir descrevem as mensagens de erro 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

Se estiver a executar uma compilação suportada, também é possível que a 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: Ocorreu um erro que o Windows PowerShell não consegue resolver. Uma sessão remota pode ter terminado.

Possíveis causas:

  • A máquina virtual existe, mas não está em execução.
  • O sistema operacional convidado não dá suporte ao PowerShell Direct. Consulte 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: Ocorreu um erro que o Windows PowerShell não consegue resolver. Uma sessão remota pode ter terminado.

Possíveis causas:

  • um dos motivos listados acima, todos eles são igualmente aplicáveis a 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: o conjunto de parâmetros não pode ser resolvido usando os parâmetros nomeados especificados.

Possíveis causas:

  • -RunAsAdministrator não tem suporte ao 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: a credencial é inválida.

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 você está se conectando como Administrador: o Administrador não foi definido como um usuário ativo. Saiba mais em Habilitar e desabilitar a conta de administrador integrada.

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

Mensagem de erro:

Enter-PSSession: o parâmetro VMName de entrada não é resolvido para nenhuma máquina virtual.

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 à Administração Just Enough (JEA).

Confira as amostras no GitHub.