Partilhar via


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

Você pode usar o PowerShell Direct para executar o PowerShell arbitrário em uma máquina virtual do 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.

Aqui estão algumas maneiras de executar o PowerShell Direct:

Requerimentos

Requisitos do sistema operacional:

  • Host: Windows 10, Windows Server 2016 ou posterior executando o Hyper-V.
  • Convidado/Máquina Virtual: Windows 10, Windows Server 2016 ou posterior.

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

Requisitos de configuração:

  • A máquina virtual deve estar sendo executada localmente no host.
  • A máquina virtual deve estar ligada e em execução com pelo menos um perfil de usuário configurado.
  • Tem de ter sessão iniciada no computador anfitrião como administrador de Hyper-V.
  • Você deve 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 na máquina virtual, como se você os digitasse diretamente em uma sessão do PowerShell na própria máquina virtual.

Para iniciar uma sessão interativa:

  1. Na máquina Hyper-V, abra o PowerShell como Administrador.

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

    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 do prompt do PowerShell da seguinte forma:

    [VMName]: PS C:\>
    

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

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

     Exit-PSSession 
    

Observação

Se a sua sessão não se conectar, consulte a solução de problemas para 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. Na máquina Hyper-V, abra o PowerShell como Administrador.

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

    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, ele será impresso no seu console. A conexão será fechada automaticamente assim que o comando for executado.

Para executar um script:

  1. Na máquina Hyper-V, abra o PowerShell como Administrador.

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

    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 esse cmdlet, consulte Invoke-Command.

Copiar ficheiros com New-PSSession e Copy-Item

Observação

O PowerShell Direct oferece suporte apenas a sessões persistentes nas compilações 14280 e posteriores do Windows

As sessões persistentes do PowerShell são incrivelmente úteis ao escrever scripts que coordenam ações em uma ou mais máquinas remotas. Uma vez criadas, as sessões persistentes existem em segundo plano até que você decida excluí-las. Isso significa que você pode fazer referência à mesma sessão repetidamente com Invoke-Command ou Enter-PSSession sem passar credenciais.

Da mesma forma, as sessões mantêm o estado. Como as sessões persistentes persistem, todas as variáveis criadas em uma sessão ou passadas para uma sessão serão preservadas em várias chamadas. Há uma série de 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 copiar ficheiros:

  1. Na máquina Hyper-V, abra o PowerShell como Administrador.

  2. Execute um dos seguintes comandos para criar uma sessão PowerShell persistente para a máquina virtual usandoNew-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.

    Advertência

    Há um bug nas compilações anteriores a 14500. Se as credenciais não forem especificadas explicitamente com o sinalizador -Credential, o serviço no convidado falhará e precisará ser reiniciado. Se você tiver 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 da máquina host para a máquina virtual, execute:

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

    Para copiar C:\guest_path\data.txt da máquina virtual para o host, 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 surgidas por meio do PowerShell Direct. As seções a seguir descrevem as mensagens de erro mais comuns, algumas causas e ferramentas para diagnosticar problemas.

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

Problema:

Enter-PSSession, Invoke-Command, ou New-PSSession não têm um -VMName ou -VMId parâmetro.

Possíveis causas:

O problema mais provável é que o PowerShell Direct não é suportado pelo seu sistema operacional host.

Você pode verificar sua compilação do Windows executando o seguinte comando:

[System.Environment]::OSVersion.Version

Se você estiver executando uma compilação com suporte, também é possível que sua versão do PowerShell não execute o PowerShell Direct. Para PowerShell Direct e JEA, a versão principal deve ser 5 ou posterior.

Você pode verificar sua compilação de versão do PowerShell executando o seguinte comando:

$PSVersionTable.PSVersion

Erro: Uma sessão remota pode ter terminado

Observação

Para Enter-PSSession, entre as compilações de anfitrião 10240 e 12400, todos os erros indicados abaixo são relatados como "A sessão remota pode ter terminado".

Mensagem de erro:

Enter-PSSession : Ocorreu um erro que o Windows PowerShell não pode manipular. Uma sessão remota pode ter terminado.

Possíveis causas:

  • A máquina virtual existe, mas não está em execução.
  • O SO convidado não suporta o PowerShell Direct. Consulte os requisitos .
  • O PowerShell ainda não está disponível no convidado
    • O sistema operacional não terminou de inicializar
    • O sistema operacional não pode inicializar corretamente
    • Alguns eventos de inicialização requerem a intervenção do utilizador

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 pode manipular. Uma sessão remota pode ter terminado.

Possíveis causas:

  • Uma das razões listadas acima -- todas elas são igualmente aplicáveis a New-PSSession
  • Um bug nas compilações atuais em que as 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 vmicvmsession usando o seguinte PowerShell:

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 é suportado ao ligar a máquinas virtuais.

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

As credenciais de administrador podem ser passadas para a máquina virtual com o -Credential parâmetro ou inserindo-as manualmente 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 hóspede
    • As credenciais fornecidas estavam incorretas.
    • Não há contas de usuário no convidado (o sistema operacional não inicializou antes)
    • Se estiver se conectando como administrador: o administrador não foi definido como um usuário ativo. Saiba mais em Ativar e desativar a conta de administrador incorporada.

Erro: O parâmetro VMName de entrada não resolve para nenhuma máquina virtual.

Mensagem de erro:

Enter-PSSession : O parâmetro de entrada VMName não corresponde a nenhuma máquina virtual.

Possíveis causas:

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

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

Exemplos e Guias do Usuário

O PowerShell Direct oferece suporte a Administração Apenas Suficiente (JEA).

Confira exemplos no GitHub.