Compartilhar 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 um Windows 10 ou superior, ou o Windows Server 2016 ou uma máquina virtual mais recente 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:

Requirements

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 VMConnect (Conexão de Máquina Virtual) ou conecte-se por meio de uma conexão de rede.

Requisitos de configuração:

  • A máquina virtual deve ser executada localmente no host.
  • A máquina virtual deve ser ativada e executada com pelo menos um perfil de usuário configurado.
  • Você deve estar conectado ao computador host como administrador 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 que você digita são executados na máquina virtual, assim como você os digitou 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 credenciais para a máquina virtual quando solicitado.

  3. Execute comandos em sua máquina virtual. Você deve ver o VMName como o prefixo do prompt do PowerShell como o seguinte:

    [VMName]: PS C:\>
    

    Qualquer comando que você executar será executado em sua máquina virtual. Para testar, executar ipconfig ou hostname verificar se 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 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 credenciais para a 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 é fechada 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 credenciais para a máquina virtual quando solicitado.

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

Para obter mais informações sobre esse 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 do Windows 14280 e posteriores

Sessões persistentes do PowerShell são incrivelmente úteis ao escrever scripts que coordenam ações em um ou mais computadores remotos. Depois de criadas, as sessões persistentes existem em segundo plano até que você decida excluí-las. Isso significa que você pode referenciar a mesma sessão repetidamente com Invoke-Command ou Enter-PSSession sem passar credenciais.

Pelo mesmo token, 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, copie os arquivos:

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

    Insira credenciais para a máquina virtual quando solicitado.

    Aviso

    Há um bug em builds antes de 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 alternativas.

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

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

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

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

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

    Remove-PSSession $s
    

Resoluçã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.

-Parâmetros de VMName ou -VMID não existem

Problema:

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

Possíveis causas:

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

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

[System.Environment]::OSVersion.Version

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

Você pode verificar o build 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 com a mensagem "Uma 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 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 ainda não terminou a inicialização
    • O sistema operacional não pode inicializar corretamente
    • Algum evento de hora de inicialização precisa de entrada do usuário

Use o cmdlet Get-VM para verificar quais VMs estão em execução 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 anteriormente — todas se aplicam a New-PSSession
  • Um bug nos builds atuais em que você deve passar explicitamente as 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 VMConnect, abra o PowerShell e reinicie o serviço de 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.

Possíveis causas:

  • 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 acesso ao administrador implícito do host, 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.

Possíveis causas:

  • As credenciais de convidado não puderam ser validadas
    • As credenciais fornecidas estavam incorretas.
    • Não há contas de usuário no convidado (o sistema operacional não foi inicializado antes)
    • Se estiver se conectando como Administrador: Administrador não está definido como um usuário ativo. Para obter mais informações, consulte Habilitar e desabilitar a conta de administrador interna.

Erro: o parâmetro VMName de entrada não é resolvido para nenhuma 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 é um administrador Hyper-V.
  • A máquina virtual não existe.

Utilize o cmdlet Get-VM para verificar se as credenciais que você está usando têm a função de administrador do 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 dá suporte à JEA (Administração Just Enough).

Confira exemplos no GitHub.