Automazione e gestione delle macchine virtuali con PowerShell

È possibile usare PowerShell Direct per eseguire PowerShell arbitrario in windows 10 o versione successiva o Windows Server 2016 o versione successiva dalla macchina virtuale Hyper-V. Usare PowerShell Direct indipendentemente dalla configurazione di rete o dalle impostazioni di gestione remota.

Ecco alcuni modi in cui è possibile eseguire PowerShell Direct:

Requisiti

Requisiti del sistema operativo:

  • Host: Windows 10, Windows Server 2016 o versione successiva che esegue Hyper-V.
  • Guest/Macchina virtuale: Windows 10, Windows Server 2016 o versione successiva.

Se è necessario gestire macchine virtuali di versioni precedenti, usare Connessione macchina virtuale (VMConnect) o configurare una rete virtuale per la macchina virtuale.

Requisiti di configurazione:

  • La macchina virtuale deve essere in esecuzione in locale nell'host.
  • La macchina virtuale deve essere attivata ed eseguita con almeno un profilo utente configurato.
  • È necessario accedere al computer host come amministratore di Hyper-V.
  • È necessario specificare credenziali utente valide per la macchina virtuale.

Creare ed uscire da una sessione interattiva di PowerShell

Il modo più semplice per eseguire i comandi di PowerShell in una macchina virtuale consiste nell'avviare una sessione interattiva.

All'avvio della sessione, i comandi digitati vengono eseguiti nella macchina virtuale, proprio come se li digitassero direttamente in una sessione di PowerShell nella macchina virtuale stessa.

Per avviare una sessione interattiva:

  1. Nell'host Hyper-V aprire PowerShell come amministratore.

  2. Eseguire uno dei comandi seguenti per creare una sessione interattiva usando il nome o il GUID della macchina virtuale:

    Enter-PSSession -VMName <VMName>
    Enter-PSSession -VMId <VMId>
    

    Specificare le credenziali per la macchina virtuale quando richiesto.

  3. Eseguire i comandi nella macchina virtuale. Il nome VMName dovrebbe essere visualizzato come prefisso per il prompt di PowerShell come segue:

    [VMName]: PS C:\>
    

    Qualsiasi esecuzione del comando verrà eseguita nella macchina virtuale. Per testare, è possibile eseguire ipconfig o hostname per assicurarsi che questi comandi siano in esecuzione nella macchina virtuale.

  4. Al termine, eseguire il comando seguente per chiudere la sessione:

     Exit-PSSession 
    

Nota

se la sessione non si connette, vedere le informazioni sulla risoluzione dei problemi per le potenziali cause.

Per altre informazioni su questi cmdlet, vedere Enter-PSSession e Exit-PSSession.

Eseguire uno script o un comando con Invoke-Command

PowerShell Direct con Invoke-Command è ideale per situazioni in cui è necessario eseguire un comando o uno script in una macchina virtuale, ma non è necessario continuare a interagire con la macchina virtuale oltre tale punto.

Per eseguire un singolo comando:

  1. Nell'host Hyper-V aprire PowerShell come amministratore.

  2. Eseguire uno dei comandi seguenti per creare una sessione usando il nome o il GUID della macchina virtuale:

    Invoke-Command -VMName <VMName> -ScriptBlock { command } 
    Invoke-Command -VMId <VMId> -ScriptBlock { command }
    

    Specificare le credenziali per la macchina virtuale quando richiesto.

    Il comando verrà eseguito nella macchina virtuale, se è presente un output nella console, verrà stampato nella console. La connessione verrà chiusa automaticamente non appena viene eseguito il comando.

Per eseguire uno script:

  1. Nell'host Hyper-V aprire PowerShell come amministratore.

  2. Eseguire uno dei comandi seguenti per creare una sessione usando il nome o il GUID della macchina virtuale:

    Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 
    Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1 
    

    Specificare le credenziali per la macchina virtuale quando richiesto.

    Lo script verrà eseguito nella macchina virtuale. La connessione verrà chiusa automaticamente non appena viene eseguito il comando.

Per altre informazioni su questo cmdlet, vedere Invoke-Command.

Copiare file con New-PSSession e Copy-Item

Nota

PowerShell Direct supporta le sessioni persistenti solo nella build 14280 di Windows e successive

Le sessioni di PowerShell persistenti sono estremamente utili quando si scrivono script che coordinano le azioni in uno o più computer remoti. Dopo la creazione, le sessioni permanenti esistono in background fino a quando non si decide di eliminarle. Ciò significa che è possibile fare riferimento alla stessa sessione più o più volte con Invoke-Command o Enter-PSSession senza passare le credenziali.

Con lo stesso token, le sessioni mantengono lo stato. Poiché le sessioni persistenti vengono mantenute, tutte le variabili create in una sessione o passate a una sessione verranno mantenute in più chiamate. Sono disponibili diversi strumenti per l'uso di sessioni persistenti. Per questo esempio si useranno New-PSSession e Copy-Item per spostare i dati dall'host a una macchina virtuale e da una macchina virtuale all'host.

Per creare una sessione e quindi copiare i file:

  1. Nell'host Hyper-V aprire PowerShell come amministratore.

  2. Eseguire uno dei comandi seguenti per creare una sessione di PowerShell persistente nella macchina virtuale usando New-PSSession.

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

    Specificare le credenziali per la macchina virtuale quando richiesto.

    Avviso

    C'è un bug nelle build precedenti alla 14500. Se le credenziali non vengono specificate in modo esplicito con -Credential flag, il servizio nel guest si arresterà in modo anomalo e dovrà essere riavviato. Se si verifica questo problema, le istruzioni alternative sono disponibili nella sezione Errore: una sessione remota potrebbe essere terminata.

  3. Copiare un file nella macchina virtuale.

    Per eseguire la copia C:\host_path\data.txt nella macchina virtuale dal computer host, eseguire:

    Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
    
  4. Copiare un file dalla macchina virtuale (nell'host).

    Per copiare C:\guest_path\data.txt nell'host dalla macchina virtuale, eseguire:

    Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
    
  5. Arrestare la sessione permanente usando Remove-PSSession.

    Remove-PSSession $s
    

Risoluzione dei problemi

È presente un piccolo set di messaggi di errore comuni visualizzati tramite PowerShell Direct. Le sezioni seguenti descrivono i messaggi di errore più comuni, alcune cause e strumenti per la diagnosi dei problemi.

I parametri -VMName o -VMID non esistono

Problema:

Enter-PSSession, Invoke-Command o New-PSSession non hanno alcun parametro -VMName o -VMId.

Possibili cause:

Il problema più probabile è che PowerShell Direct non è supportato dal sistema operativo host.

È possibile controllare la compilazione di Windows eseguendo il comando seguente:

[System.Environment]::OSVersion.Version

Se si esegue una build supportata, è anche possibile che la versione di PowerShell non esegua PowerShell Direct. Per PowerShell Direct e JEA, la versione principale deve essere 5 o successiva.

È possibile controllare la build della versione di PowerShell eseguendo il comando seguente:

$PSVersionTable.PSVersion

Errore: una sessione remota potrebbe essere terminata

Nota

Per Enter-PSSession tra build host 10240 e 12400, tutti gli errori riportati di seguito sono stati segnalati come "Una sessione remota potrebbe essere terminata".

Messaggio di errore:

Enter-PSSession: si è verificato un errore che windows PowerShell non può gestire. Potrebbe essere stata terminata una sessione remota.

Possibili cause:

  • La macchina virtuale esiste ma non è in esecuzione.
  • Il sistema operativo guest non supporta PowerShell Direct. Vedere i requisiti.
  • PowerShell non è ancora disponibile nel guest
    • L'avvio del sistema operativo non è terminato
    • Il sistema operativo non può essere avviato correttamente
    • Per alcuni eventi di avvio è necessario l'input dell'utente

È possibile usare il cmdlet Get-VM per verificare quali macchine virtuali sono in esecuzione nell'host.

Messaggio di errore:

New-PSSession: si è verificato un errore che Windows PowerShell non può gestire. Potrebbe essere stata terminata una sessione remota.

Possibili cause:

  • Uno dei motivi elencati in precedenza: tutti sono ugualmente applicabili a New-PSSession
  • Bug nelle compilazioni correnti in cui le credenziali devono essere passate in modo esplicito con -Credential. In questo caso, l'intero servizio si blocca nel sistema operativo guest e deve essere riavviato. È possibile verificare se la sessione è ancora disponibile con Enter-PSSession.

Per risolvere il problema delle credenziali, accedere alla macchina virtuale usando VMConnect, aprire PowerShell e riavviare il servizio vmicvmsession usando powerShell seguente:

Restart-Service -Name vmicvmsession

Errore: Impossibile risolvere il set di parametri

Messaggio di errore:

Enter-PSSession: il set di parametri non può essere risolto usando i parametri denominati specificati.

Possibili cause:

  • -RunAsAdministrator non è supportato quando ci si connette a macchine virtuali.

    Quando ci si connette a un contenitore di Windows, il -RunAsAdministrator flag consente connessioni di amministratore senza credenziali esplicite. Poiché le macchine virtuali non assegnano all'host l'accesso amministratore implicito, è necessario immettere in modo esplicito le credenziali.

Le credenziali di amministratore possono essere passate alla macchina virtuale con il -Credential parametro o immettendole manualmente quando richiesto.

Errore: La credenziale non è valida

Messaggio di errore:

Enter-PSSession: le credenziali non sono valide.

Possibili cause:

  • Non è stato possibile convalidare le credenziali guest
    • Le credenziali specificate non sono corrette.
    • Non sono presenti account utente nel guest (il sistema operativo non è stato avviato prima)
    • Se ci si connette come amministratore: l'amministratore non è stato impostato come utente attivo. Per altre informazioni, vedere Abilitare e disabilitare l'account amministratore predefinito.

Errore: il parametro VMName di input non viene risolto in alcuna macchina virtuale.

Messaggio di errore:

Enter-PSSession: il parametro VMName di input non viene risolto in alcuna macchina virtuale.

Possibili cause:

  • Non si è un amministratore di Hyper-V.
  • La macchina virtuale non esiste.

È possibile usare il cmdlet Get-VM per verificare che le credenziali usate abbiano il ruolo di amministratore Hyper-V e per vedere quali macchine virtuali sono in esecuzione localmente nell'host e avviare.

Esempi e guide utente

PowerShell Direct supporta Just Enough Administration (JEA).

Vedere gli esempi in GitHub.