Condividi tramite


Automazione e gestione di macchine virtuali con PowerShell

È possibile usare PowerShell Direct per eseguire PowerShell in modo arbitrario in una macchina virtuale Windows 10 o Windows Server 2016 dall'host Hyper-V indipendentemente dalle impostazioni di configurazione di rete o di gestione remota.

Ecco alcuni modi per eseguire PowerShell Direct:

Requisiti

Requisiti del sistema operativo:

  • Host: Windows 10, Windows Server 2016 o versione successiva con 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 eseguita localmente nell'host.
  • La macchina virtuale deve essere attivata e in esecuzione 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 e chiudere una sessione interattiva di PowerShell

Il modo più semplice di eseguire i comandi di PowerShell in una macchina virtuale è avviare una sessione interattiva.

All'avvio della sessione, i comandi digitati vengono eseguiti nella macchina virtuale, esattamente come se fossero stati digitati 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>

Fornire le credenziali per la macchina virtuale quando richiesto.

  1. Eseguire i comandi sulla macchina virtuale.

Si dovrebbe vedere VMName come prefisso per il prompt dei comandi di PowerShell come illustrato:

[VMName]: PS C:\>

Qualsiasi comando viene eseguito sulla macchina virtuale. A scopo di test, è possibile eseguire ipconfig o hostname per assicurarsi che questi comandi siano eseguiti nella macchina virtuale.

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

    Exit-PSSession 
    

Nota: se la sessione non si connette, vedere la risoluzione dei problemi per possibili 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 è perfetto per le situazioni in cui è necessario eseguire un comando o uno script su una macchina virtuale ma non si ha bisogno di continuare con la macchina virtuale oltre quel 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 }
    

    Fornire le credenziali per la macchina virtuale quando richiesto.

    Il comando verrà eseguito nella macchina virtuale e, se l'output ha come destinazione la console, verrà stampato sulla 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 
    

    Fornire le credenziali per la macchina virtuale quando richiesto.

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

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


Copiare i file con New-PSSession e Copy-Item

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

Le sessioni persistenti di PowerShell sono molto utili quando si compongono script che coordinano le azioni su una o più computer remoti. Le sessioni permanenti, una volta create rimangono in background finché non si decide di eliminarle. Perciò è possibile fare riferimento più volte alla stessa sessione con Invoke-Command o Enter-PSSession senza passare credenziali.

Mediante lo stesso token, le sessioni mantengono lo stato. Poiché le sessioni permanenti sono persistenti, tutte le variabili create in una sessione o passate a una sessione verranno mantenute tra più chiamate. Sono disponibili numerosi strumenti per lavorare con le sessioni persistenti. Per questo esempio si userà New-PSSession e Copy-Item per spostare 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 per la macchina virtuale usando New-PSSession.

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

Fornire le credenziali per la macchina virtuale quando richiesto.

Avviso:
Nelle build precedenti la 14500 è presente un bug. Se le credenziali non sono specificate in modo esplicito con il flag -Credential, il servizio nel guest si arresterà e dovrà essere riavviato. Se si verifica questo problema, le istruzioni per la soluzione alternativa sono disponibili qui.

  1. Copiare un file nella macchina virtuale.

Per copiare C:\host_path\data.txt nella macchina virtuale dalla macchina host, eseguire:

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

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

Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
  1. Arrestare la sessione persistente mediante Remove-PSSession.
Remove-PSSession $s

Risoluzione dei problemi

Con PowerShell Direct viene visualizzato un numero ridotto di messaggi di errore comuni. Ecco i più frequenti, alcune delle cause e gli strumenti per la diagnosi dei problemi.

I parametri -VMName e -VMID non esistono

Problema:
Enter-PSSession, Invoke-Commando New-PSSession non hanno un -VMName parametro o -VMId .

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

È possibile controllare la build 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, il numero di versione maggiore deve essere 5 o successivo.

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

$PSVersionTable.PSVersion

Errore: una sessione remota potrebbe essere stata terminata

Nota:
Per Enter-PSSession fra le build dell'host 10240 e 12400, tutti gli errori indicati sotto come "Una sessione remota potrebbe essere stata terminata".

Messaggio di errore:

Enter-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

Possibili cause:

  • La macchina virtuale esiste ma non è in esecuzione.
  • Il sistema operativo guest non supporta PowerShell Direct. Vedere la pagina dei requisiti
  • PowerShell non è ancora disponibile nel guest
    • L'avvio del sistema operativo non è ancora completato
    • Il sistema operativo non può essere avviato correttamente
    • Alcuni eventi di avvio richiedono l'input dell'utente

È possibile usare il cmdlet Get-VM per controllare quali VM sono in esecuzione sull'host.

Messaggio di errore:

New-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

Possibili cause:

  • Uno dei motivi elencati sopra - tutti sono ugualmente applicabili a New-PSSession
  • Un bug nelle build correnti per 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 aggirare il problema delle credenziali, accedere alla macchina virtuale tramite VMConnect, aprire PowerShell e riavviare il servizio vmicvmsession usando il comando PowerShell seguente:

Restart-Service -Name vmicvmsession

Errore: impossibile risolvere il set di parametri

Messaggio di errore:

Enter-PSSession : Parameter set cannot be resolved using the specified named parameters.

Possibili cause:

  • -RunAsAdministrator non è supportato durante la connessione alle macchine virtuali.

    In caso di connessione a un contenitore di Windows, il flag -RunAsAdministrator consente le connessioni amministrative senza credenziali esplicite. Poiché le macchine virtuali non concedono all'host l'accesso amministratore implicito, è necessario immettere le credenziali in modo esplicito.

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

Errore: Le credenziali non sono valide.

Messaggio di errore:

Enter-PSSession : The credential is invalid.

Possibili cause:

  • Non è possibile convalidare le credenziali guest
    • Le credenziali specificate non sono corrette.
    • Non sono disponibili 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. Fare clic qui per altre informazioni.

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

Messaggio di errore:

Enter-PSSession : The input VMName parameter does not resolve to any virtual machine.

Possibili cause:

  • L'utente non è 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 di Hyper-V e visualizzare le macchine virtuali eseguite in locale nell'host e avviate.


Esempi e manuali dell'utente

PowerShell Direct supporta JEA (Just Enough Administration). Consultare il manuale dell'utente per provare.

Vedere gli esempi in GitHub.