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:
- Como uma sessão interativa usando o cmdlet Enter-PSSession
- Como uma seção de uso único para executar somente um comando ou script usando o cmdlet Invoke-Command
- Como uma sessão persistente (build 14280 e posteriores) usando os cmdlets novos-PSSession, Copy-Item e Remove-PSSession
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:
No servidor do Hyper-V, abra o PowerShell como Administrador.
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.
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
ouhostname
para se certificar de que esses comandos estão em execução na máquina virtual.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:
No servidor do Hyper-V, abra o PowerShell como Administrador.
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:
No servidor do Hyper-V, abra o PowerShell como Administrador.
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:
No servidor do Hyper-V, abra o PowerShell como Administrador.
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.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\
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\
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.