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:
- Come sessione interattiva usando il cmdlet Enter-PSSession
- Come sezione a uso singolo per eseguire un singolo comando o uno script usando il cmdlet Invoke-Command
- Come sessione persistente (build 14280 e successive) usando i cmdlet New-PSSession, Copy-Item e Remove-PSSession
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:
Nell'host Hyper-V aprire PowerShell come amministratore.
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.
- 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.
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:
Nell'host Hyper-V aprire PowerShell come amministratore.
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:
Nell'host Hyper-V aprire PowerShell come amministratore.
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:
Nell'host Hyper-V aprire PowerShell come amministratore.
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.
- 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\
- 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\
- 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-Command
o 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.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per