- PowerShell Direct consente di gestire le macchine virtuali Hyper-V senza dipendere dalla rete, utilizzando il bus interno tra l'host e la macchina virtuale.
- Richiede Windows 10 o Server 2016 o versioni successive sia sul sistema host che su quello guest, e credenziali valide all'interno della macchina virtuale.
- Supporta i comandi Enter-PSSession, Invoke-Command, New-PSSession e Copy-Item con i parametri -VMName o -VMId.
- Offre un canale affidabile per l'automazione, la copia di file e la risoluzione dei problemi, anche in caso di guasti alla rete o al firewall.

Se lavorate con macchine virtuali in Hyper-V e passate le giornate a combattere con reti, firewall e criteri che bloccano l'accesso remoto, PowerShell Direct vi risparmierà un sacco di problemi . È una di quelle funzionalità che, una volta provata, vi chiederete come abbiate fatto a vivere senza.
Con PowerShell Direct, è possibile eseguire comandi e script direttamente all'interno di una macchina virtuale dall'host, senza dover dipendere da una connessione di rete, aprire porte o configurare WinRM. Tutto viaggia attraverso il bus interno della macchina virtuale, localmente e in modo del tutto trasparente per l'amministratore.
Che cos'è esattamente PowerShell Direct?
PowerShell Direct è una funzionalità introdotta in Windows 10 e Windows Server 2016 che consente di aprire una sessione PowerShell direttamente su una macchina virtuale in esecuzione sullo stesso host Hyper-V, utilizzando il canale interno fornito dall'hypervisor stesso anziché la rete.
Grazie a questo meccanismo, la macchina virtuale non necessita di una scheda di rete , né di essere connessa a uno switch virtuale, né è necessario configurare l'amministrazione remota o regole firewall specifiche. Finché la VM è accesa e il sistema operativo guest si è avviato correttamente, è possibile gestirla con PowerShell Direct.
In pratica, questo significa che non dipenderete più dalla connettività IP per le attività di automazione, la configurazione iniziale, i test di laboratorio, le dimostrazioni o la risoluzione dei problemi quando una configurazione di rete inadeguata vi ha lasciato al buio. Potrete continuare a lavorare senza dover accedere alla console grafica di Hyper-V e inserire manualmente ogni dato.
Prima dell'introduzione di questa funzionalità, l'unico modo per eseguire comandi PowerShell su una macchina virtuale Hyper-V era tramite la rete utilizzando `Invoke-Command` o `Enter-PSSession` , passando il nome del computer o l'indirizzo IP (`-ComputerName`). Se la macchina si trovava su una rete isolata, con un firewall molto restrittivo o semplicemente senza una scheda di rete, era necessario utilizzare la console della macchina virtuale.
PowerShell Direct cambia le regole del gioco: ora è possibile utilizzare i cmdlet di accesso remoto classici, ma indirizzando il traffico al nome della macchina virtuale o al suo GUID (-VMName o -VMId) anziché al nome del computer di rete, e tutto il traffico passa attraverso il bus interno gestito da Hyper-V.
Requisiti per poter utilizzare PowerShell Direct
Prima di iniziare a provarlo, è consigliabile assicurarsi di soddisfare i requisiti minimi di sistema operativo e di configurazione , sia sull'host che sulle macchine virtuali.
Per quanto riguarda il sistema operativo host Hyper-V, è necessario Windows 10, Windows 11 o Windows Server 2016 o versioni successive , con il ruolo Hyper-V installato ed in esecuzione. Le versioni precedenti di Windows Server o le edizioni client che non supportano questa funzionalità non espongono i parametri -VMName e -VMID nei cmdlet di accesso remoto.
Per quanto riguarda i sistemi guest, PowerShell Direct richiede che anche la macchina virtuale esegua Windows 10, Windows 11 o Windows Server 2016 o versioni successive . Se gestisci macchine virtuali con versioni precedenti di Windows, dovrai continuare a utilizzare VMConnect o la gestione di rete remota tradizionale.
Inoltre, la macchina virtuale deve essere ospitata ed eseguita sullo stesso host Hyper-V da cui ci si connette. Non funzionerà per la gestione di macchine virtuali residenti su un server Hyper-V remoto diverso; in questi casi, sarà necessario combinare il classico PowerShell remoto sull'host con un altro meccanismo.
Un altro requisito importante è che la macchina virtuale sia accesa e che abbia almeno un profilo utente configurato nel sistema operativo guest. Se il sistema operativo non ha completato l'avvio o si blocca richiedendo l'intervento dell'utente, la connessione PowerShell Direct non verrà stabilita correttamente.
Sul lato host, è necessario aprire la console PowerShell con privilegi di amministratore Hyper-V . Ciò significa che il proprio account deve appartenere al gruppo degli amministratori Hyper-V affinché i cmdlet che utilizzano -VMName o -VMID possano accedere alle informazioni sulla macchina virtuale e al canale interno che la collega all'host.
Infine, per accedere alla sessione del sistema guest, è necessario fornire credenziali utente valide all'interno della macchina virtuale . Non esiste un accesso "magico" senza autenticazione: l'host non ottiene automaticamente i privilegi di amministratore sulla VM, quindi è necessario inserire nome utente e password per un account valido (di solito un account locale o di dominio con privilegi di amministratore all'interno della VM).
Come funziona PowerShell Direct nella pratica
Per l'uso quotidiano, PowerShell Direct si basa sugli stessi cmdlet di PowerShell Remoting, ma aggiunge parametri specifici per Hyper-V che sostituiscono il classico -ComputerName. I cmdlet principali sono:
- Enter-PSSession per creare una sessione interattiva.
- Invoke-Command per eseguire uno o più comandi o script.
- Nuova PSSession per generare sessioni persistenti riutilizzabili.
- Copia-oggetto combinato con le sessioni per trasferire file tra l'host e la macchina virtuale.
Anziché utilizzare il nome del computer di rete, PowerShell Direct utilizza -VMName o -VMID , che fanno riferimento al nome della macchina virtuale in Hyper-V o al suo identificatore univoco (GUID). Per individuarli rapidamente, è possibile utilizzare:
Get-VM | Select Name, Id
Da lì, qualsiasi comando di accesso remoto che supporti questi parametri può aprire una sessione direttamente sulla macchina virtuale , a condizione che siano soddisfatte le condizioni di versione e di autorizzazione di cui abbiamo parlato.
Crea e chiudi una sessione interattiva con Enter-PSSession
Il modo più comodo per iniziare a lavorare con PowerShell Direct è solitamente quello di stabilire una sessione interattiva , in cui tutto ciò che si digita nella console host viene eseguito come se ci si trovasse all'interno di una finestra di PowerShell nella macchina virtuale stessa.
Il primo passo consiste nell'aprire una console PowerShell sull'host Hyper-V, eseguendola come amministratore . Da lì, è possibile accedere in diversi modi, ad esempio utilizzando il nome della macchina virtuale:
Enter-PSSession -VMName "NombreDeLaVM" -Credential (Get-Credential)
Se preferisci, puoi utilizzare il GUID della macchina virtuale che ottieni con Get-VM, usando il parametro -VMID invece di -VMName:
Enter-PSSession -VMId <VMId> -Credential (Get-Credential)
Quando esegui uno di questi comandi, PowerShell ti chiederà le credenziali del sistema guest . Inserisci il nome utente e la password di un account valido all'interno della macchina virtuale e, se tutto è corretto, vedrai il prompt cambiare, visualizzando il nome della macchina virtuale come prefisso, in questo modo:
: PS C:\>
Da quel momento, Tutto ciò che esegui avviene all'interno della macchina virtuale.È possibile eseguire semplici test come l'avvio hostname o ipconfig per verificare che ti trovi effettivamente nell'ambiente guest e non sull'host.
Al termine, è sufficiente chiudere la sessione interattiva utilizzando il cmdlet Exit-PSSession . In questo modo si torna al prompt dell'host e si chiude la connessione PowerShell Direct alla macchina virtuale.
Esegui comandi o script specifici con Invoke-Command
In molti casi, non è necessario aprire una lunga sessione interattiva, ma è sufficiente eseguire uno o più comandi e raccoglierne l'output . Per questo, Invoke-Command è l'opzione più flessibile quando si lavora con PowerShell Direct.
Se si desidera eseguire un singolo comando su una macchina virtuale senza mantenere la sessione aperta, è possibile farlo dall'host in questo modo:
Invoke-Command -VMName "NombreDeLaVM" -ScriptBlock { Get-Process }
Oppure, se preferisci lavorare con il GUID visualizzato da Hyper-V, puoi utilizzare l'identificativo della macchina virtuale:
Invoke-Command -VMId <VMId> -ScriptBlock { Get-Process }
In entrambi i casi, PowerShell richiederà le credenziali della macchina virtuale se non si dispone già di una sessione attiva. Una volta autenticato, il comando viene eseguito all'interno della macchina virtuale e l'output viene visualizzato nella console host. Al termine, la connessione si chiude automaticamente.
Se invece di un singolo comando si desidera eseguire uno script completo residente sull'host , è possibile farvi riferimento utilizzando il parametro -FilePath di Invoke-Command. Lo script verrà quindi inviato e avviato all'interno della macchina virtuale.
Invoke-Command -VMName "NombreDeLaVM" -FilePath C:\host\scripts\config.ps1
È possibile utilizzare anche la variante basata sull'ID della macchina virtuale, mantenendo lo stesso concetto: il file si trova sull'host, ma viene eseguito all'interno della macchina virtuale , il che semplifica notevolmente le attività di configurazione automatizzata in laboratori e ambienti di test.
Utilizza sessioni persistenti e copia file con New-PSSession e Copy-Item
Oltre alle sessioni interattive o ai comandi singoli, PowerShell Direct dà il meglio di sé se combinato con sessioni persistenti create tramite New-PSSession. Queste sessioni vengono eseguite in background e possono essere riutilizzate tutte le volte che è necessario, preservando lo stato e le variabili tra un'esecuzione e l'altra.
Per creare una sessione persistente su una macchina virtuale utilizzando PowerShell Direct, puoi procedere in modo molto semplice come segue:
$s = New-PSSession -VMName "NombreDeLaVM" -Credential (Get-Credential)
Se stai lavorando con il GUID, dovresti modificare il parametro in -VMId e lasciare invariato il resto , salvando la sessione risultante in una variabile in modo da poterla richiamare in seguito in altri cmdlet:
$s = New-PSSession -VMId <VMId> -Credential (Get-Credential)
Una volta creata la sessione, è possibile riutilizzarla con Invoke-Command, Enter-PSSession o, cosa molto interessante, per trasferire file utilizzando Copy-Item , senza bisogno di condividere cartelle di rete o montare ulteriori ISO o dischi.
Ad esempio, per copiare un file dall'host alla macchina virtuale, si utilizza il parametro -ToSession che punta alla sessione creata in precedenza:
Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
Analogamente, se si desidera trasferire un file dalla macchina virtuale all'host, è necessario utilizzare la variante -FromSession di Copy-Item , specificando il percorso di origine sulla macchina guest e la cartella di destinazione sull'host:
Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
Quando non è più necessario utilizzare quella sessione persistente, è buona norma chiuderla con Remove-PSSession per liberare risorse sia sul sistema operativo host che su quello guest:
Remove-PSSession $s
I vantaggi concreti dell'utilizzo di PowerShell Direct nella vita di tutti i giorni
Al di là della teoria, PowerShell Direct dà il meglio di sé negli scenari di amministrazione e di laboratorio , spesso compromessi da problemi di rete. Se vi occupate di prove di concetto (POC), demo, ambienti di test o di formazione, sapete quanto possa essere frustrante dover dipendere costantemente da una connettività inaffidabile.
Uno scenario tipico si verifica quando si modificano le impostazioni di rete all'interno di una macchina virtuale e, a causa di un errore in un indirizzo IP, VLAN o route, si perde l'accesso remoto. In precedenza, era necessario aprire la console di Hyper-V e correggere manualmente il problema. Ora, a condizione che il sistema operativo si avvii correttamente, è possibile connettersi tramite PowerShell Direct e correggere la configurazione senza che la macchina virtuale necessiti di una connessione di rete funzionante.
Qualcosa di simile accade quando si applicano criteri di dominio che modificano le regole del firewall o le impostazioni di sicurezza . Un GPO configurato in modo errato potrebbe impedire l'utilizzo del classico PowerShell Remoting. Con questa funzionalità, si ha comunque un accesso diretto al sistema guest per verificare quale criterio ha causato il problema e risolverlo.
È particolarmente utile anche per automatizzare l'installazione e l'avvio iniziale delle macchine virtuali , evitando soluzioni alternative come RunOnce o script da inserire in Sysprep. È possibile preparare gli script di configurazione sull'host ed eseguirli non appena la macchina virtuale viene accesa, senza dover dipendere dall'ottenimento di un indirizzo IP o dalla risoluzione dei nomi.
Dal punto di vista dei fornitori di servizi e degli ambienti cloud basati su Hyper-V, PowerShell Direct è chiaramente progettato per semplificare la gestione di massa delle macchine virtuali . Consente agli amministratori di mantenere un unico canale di gestione anche in reti isolate o altamente segmentate, risultando ideale per ambienti multi-tenant o per quelli con rigorosi requisiti di sicurezza.
Messaggi di errore comuni e come diagnosticarli
Come ogni tecnologia, anche PowerShell Direct non è esente da problemi. Esistono diversi messaggi di errore piuttosto comuni che è bene conoscere per poter reagire tempestivamente quando si presentano.
Uno dei problemi più comuni è che i cmdlet Enter-PSSession, Invoke-Command o New-PSSession non visualizzano i parametri -VMName o -VMId . Se ciò accade, è molto probabile che il sistema operativo host non supporti questa funzionalità, poiché si sta utilizzando una versione precedente di Windows che non la includeva ancora.
Per verificare la versione di Windows sul sistema host, è possibile utilizzare il seguente comando PowerShell, che visualizza il numero di build del sistema:
::OSVersion.Version
È inoltre importante verificare che la versione di PowerShell in uso sia la 5 o superiore , poiché PowerShell Direct e le funzionalità correlate come JEA richiedono almeno questa versione principale. È possibile verificarlo con:
$PSVersionTable.PSVersion
Un altro errore comune è il messaggio che indica "Si è verificato un errore che PowerShell non è in grado di gestire. Una sessione remota potrebbe essere terminata" quando si utilizza Enter-PSSession o New-PSSession su una macchina virtuale. Questo problema è solitamente causato dal fatto che la macchina virtuale esiste ma non è in esecuzione, oppure dal fatto che il sistema guest non supporta PowerShell Direct perché non soddisfa i requisiti di versione.
In altri casi, l'errore si verifica perché PowerShell non è ancora disponibile all'interno della macchina virtuale , in quanto il sistema operativo è ancora in fase di avvio, presenta un errore critico all'avvio o è in attesa di input da parte dell'utente nella console. Per verificare rapidamente quali macchine virtuali sono in esecuzione sull'host, è possibile utilizzare:
Get-VM
Esiste un caso particolare in cui lo stesso messaggio di errore si verifica con New-PSSession a causa di un bug che impone il passaggio obbligatorio delle credenziali con -Credential . In questo caso, il servizio relativo alle sessioni VM all'interno della macchina guest potrebbe non rispondere e necessitare di essere riavviato dalla macchina guest stessa.
Per risolvere questa situazione, accedi alla macchina virtuale tramite VMConnect, apri PowerShell e riavvia il servizio vmicvmsession con questo comando:
Restart-Service -Name vmicvmsession
Un altro messaggio che compare abbastanza spesso è "impossibile risolvere il set di parametri" quando si tenta di utilizzare Enter-PSSession con opzioni non compatibili con le macchine virtuali, come il parametro -RunAsAdministrator, che si applica nel caso dei container Windows, ma non nelle macchine virtuali.
Nel contesto di PowerShell Direct, è consigliabile evitare di utilizzare -RunAsAdministrator quando ci si connette a macchine virtuali e fornire invece esplicitamente le credenziali di un account con privilegi di amministratore sul sistema guest, tramite -Credential o inserendole quando PowerShell lo richiede a schermo.
Infine, è piuttosto comune imbattersi in errori come "credenziali non valide" o messaggi che indicano che il parametro VMName non corrisponde ad alcuna macchina virtuale. Nel primo caso, verifica che il nome utente e la password esistano e siano corretti all'interno della VM e che l'account amministratore locale non sia disabilitato se stai tentando di connetterti tramite esso.
Nel secondo caso, di solito significa che la macchina virtuale non esiste sull'host o che il tuo account utente non dispone dei privilegi di amministratore Hyper-V . Anche in questo caso, puoi utilizzare Get-VM per visualizzare l'elenco delle macchine virtuali disponibili e verificare se le tue credenziali includono i privilegi di amministratore Hyper-V necessari.
Procedure consigliate e utilizzi avanzati di PowerShell Direct.
Una volta apprese le nozioni di base, è facile sfruttare al meglio PowerShell Direct combinandolo con script di automazione, JEA e sessioni condivise in ambienti di amministrazione delegata.
Ad esempio, è possibile definire funzioni che astraggono la logica ripetitiva della connessione alle macchine virtuali tramite -VMName o -VMID, in modo che gli script orchestrino le modifiche su più macchine virtuali senza dover ripetere lo stesso blocco di codice per l'autenticazione e la selezione delle macchine virtuali più e più volte.
È inoltre possibile integrarlo con Just Enough Administration (JEA) per consentire ad altri operatori di accedere a un set molto limitato di comandi eseguibili sulle macchine virtuali, mantenendo un elevato livello di sicurezza ma senza rinunciare alla comodità di utilizzare il canale diretto di Hyper-V.
In scenari più complessi, è comune utilizzare sessioni New-PSSession persistenti su più macchine virtuali in parallelo, memorizzando ciascuna sessione in una variabile e quindi richiamando comandi coordinati tramite Invoke-Command su più sessioni contemporaneamente . Ciò consente di distribuire configurazioni simultanee senza la necessità di aprire connessioni di rete tradizionali.
PowerShell Direct è molto utile anche quando è necessario copiare file ISO di grandi dimensioni, programmi di installazione o pacchetti di configurazione su macchine virtuali che non hanno accesso di rete ai repository standard. Utilizzando Copy-Item con -ToSession e -FromSession, si evita la dipendenza da SMB, HTTP o qualsiasi altro protocollo di trasporto classico.
In sintesi, si tratta di uno strumento che, se usato con saggezza, semplifica notevolmente l'amministrazione degli ambienti Hyper-V , riduce il tempo sprecato in attività ripetitive e offre molta più flessibilità in caso di problemi a livello di rete o di policy di sicurezza.
PowerShell Direct si è affermato come strumento fondamentale per chiunque gestisca Hyper-V, in quanto offre un canale di gestione affidabile anche nelle peggiori condizioni di rete , consente di eseguire comandi e script direttamente all'interno delle macchine virtuali, facilita il trasferimento di file e garantisce un notevole incremento di agilità negli ambienti di laboratorio, produzione e cloud privato.
Scrittore appassionato del mondo dei byte e della tecnologia in generale. Adoro condividere le mie conoscenze attraverso la scrittura, ed è quello che farò in questo blog, mostrarti tutte le cose più interessanti su gadget, software, hardware, tendenze tecnologiche e altro ancora. Il mio obiettivo è aiutarti a navigare nel mondo digitale in modo semplice e divertente.

