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 estiver a gerir máquinas virtuais mais antigas, utilize a Ligação à Máquina Virtual (VMConnect) ou ligue-se através de uma ligação de rede.

Requisitos de configuração:

  • A máquina virtual deve ser 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. No host 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>
    

    Insira as credenciais da 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 é executado na máquina virtual. Para testar, executar ipconfig ou hostname certificar-se de que esses comandos são 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. No host 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 }
    

    Insira as credenciais da máquina virtual quando solicitado.

    O comando é executado na máquina virtual. Se o comando produzir saída, você a verá no console. A conexão fecha automaticamente assim que o comando é executado.

Para executar um script:

  1. No host 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 
    

    Insira as credenciais da máquina virtual quando solicitado.

    O script é executado na máquina virtual. A conexão fecha automaticamente assim que o comando é executado.

Para obter mais informações 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 são preservadas em várias chamadas. Você pode usar várias ferramentas para trabalhar com sessões persistentes. Para este exemplo, use 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. No host 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 usando New-PSSession.

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

    Insira as credenciais da máquina virtual quando solicitado.

    Advertência

    Há um bug nas compilações anteriores a 14500. Se você não especificar explicitamente as credenciais com o -Credential sinalizador, o serviço no convidado falhará e precisará ser reiniciado. Se você encontrar esse problema, consulte a seção Erro: uma sessão remota pode ter terminado para obter instruções de solução alternativa.

  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

O PowerShell Direct apresenta um pequeno conjunto de mensagens de erro comuns. 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 parâmetro -VMName ou -VMId.

Causas potenciais:

O problema mais provável é que seu sistema operacional host não oferece suporte ao PowerShell Direct.

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 ofereça suporte ao 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 host 10240 e 12400, todos os erros são relatados como "Uma sessão remota pode ter terminado".

Mensagem de erro:

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

Causas potenciais:

  • 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 tempo de inicialização precisam da entrada do usuário

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

Causas potenciais:

  • Uma das razões listadas anteriormente - todas elas se aplicam a New-PSSession
  • Um bug nas compilações atuais onde você deve passar explicitamente credenciais com -Credential. Quando esse bug ocorre, 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, entre na máquina virtual usando o VMConnect, abra o PowerShell e reinicie o serviço vmicvmsession com o seguinte comando do 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.

Causas potenciais:

  • Você não pode usar -RunAsAdministrator ao se conectar 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.

Você pode passar credenciais de administrador 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.

Causas potenciais:

  • 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 ligar como Administrador: o Administrador não está definido como um utilizador ativo. Para obter mais informações, consulte Habilitar e desabilitar a conta de administrador interna.

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

Mensagem de erro:

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

Causas potenciais:

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

Use 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 utilizador

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

Confira exemplos no GitHub.