Creare un disco VHDX avviabile direttamente da un file WIM con PowerShell
Quando lavorate con Hyper-V, soprattutto in ambienti di laboratorio, una delle operazioni che capita abbastanza spesso di eseguire è la creazione di nuove macchine virtuali partendo da un’immagine di Windows.
La procedura classica prevede la creazione della macchina virtuale, il collegamento del file ISO di Windows e l’installazione del sistema operativo. È una procedura semplice, ma richiede comunque di completare ogni volta il setup di Windows e attendere che l’installazione venga completata.
In realtà possiamo velocizzare parecchio questa operazione creando direttamente un disco VHDX avviabile a partire dal file install.wim presente nel supporto di installazione di Windows.
In questo modo possiamo ottenere rapidamente un disco virtuale già contenente Windows e utilizzarlo immediatamente per creare una nuova macchina virtuale Hyper-V.
WindowsImageTools
Per automatizzare questa operazione possiamo utilizzare WindowsImageTools, un progetto PowerShell open source disponibile su GitHub che mette a disposizione diversi strumenti per lavorare con le immagini Windows. Il progetto è disponibile alla pagina GitHub – BladeFireLight/WindowsImageTools: PowerShell Tools creating and updating Windows Images · GitHub

Figura 1: WindowsImageTools, progetto PowerShell open source disponibile su GitHub
La funzione principale è Convert-Wim2VHD, che permette di prendere un’immagine contenuta in un file WIM e applicarla direttamente all’interno di un disco virtuale VHD o VHDX, preparando anche le partizioni necessarie per renderlo avviabile.
Questo significa che non dobbiamo installare Windows all’interno della macchina virtuale: il sistema operativo viene applicato direttamente al disco.
Lo script qui di seguito esegue tutte le operazioni necessarie per creare in modo semplice un disco VHDX avviabile partendo dal file install.wim presente nella ISO di Windows. Dopo aver montato la ISO del sistema operativo e dopo aver installato il modulo WindowsImageTools, vengono visualizzate le diverse edizioni contenute nel file WIM, permettendomi di scegliere graficamente quella che voglio utilizzare. L’immagine selezionata viene quindi applicata a un nuovo VHDX dinamico, configurato con layout UEFI/GPT e pronto per essere collegato, ad esempio, a una macchina virtuale Hyper-V di seconda generazione.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#Installa il NuGet package provider Install-PackageProvider -Name "NuGet" -Force #Installa il modulo per convertire le immagini contenute nella ISO Set-ExecutionPolicy Unrestricted -Scope CurrentUser Install-Module -Name WindowsImageTools -Force # Percorso del file WIM. È necessario prima montare la ISO e verificare la lettera assegnata dal sistema operativo $imagepath = "F:\sources\install.wim" # Mostra la lista delle immagini contenute nel WIM $IndexList = Get-WindowsImage -ImagePath $imagepath # Selezione grafica dell'edizione $item = $IndexList | Out-GridView -Title "Seleziona l'immagine Windows" -OutputMode Single # Se l'utente chiude la finestra senza selezionare nulla, esce if (-not $item) { Write-Host "Nessuna immagine selezionata." return } $index = $item.ImageIndex # Percorso VHDX di destinazione $vhdPath = "C:\Base\Windows11Pro.vhdx" # Converte il WIM in VHDX Convert-Wim2VHD -SourcePath $imagepath -Index $index -Path $vhdPath -Size 100GB -Dynamic -DiskLayout UEFI -Force |

Figura 2: Selezione dell’edizione di Windows da utilizzare per la creazione del disco VHDX

Figura 3: Creazione del disco VHDX avviabile con Convert-Wim2VHD
Un aspetto importante riguarda il parametro -DiskLayout. Con Convert-Wim2VHD non è necessario specificare direttamente che il disco deve utilizzare GPT. I valori disponibili sono BIOS, UEFI e WindowsToGo. Utilizzando UEFI viene creato un disco con schema di partizionamento GPT, adatto quindi alle macchine virtuali Hyper-V Generation 2. L’opzione BIOS viene invece utilizzata per creare dischi MBR, destinati alle VM Hyper-V di prima generazione.
Anche il parametro -Dynamic merita una precisazione. Si tratta di uno switch che, quando presente, crea un VHDX a espansione dinamica. La dimensione massima viene indicata tramite -Size, utilizzando direttamente valori PowerShell come 100GB.
Convert-Wim2VHD non si limita però a creare un disco GPT e a copiarvi i file di Windows. La funzione prepara automaticamente il layout delle partizioni necessario per rendere il disco avviabile in modalità UEFI, applica l’immagine Windows selezionata e configura il boot. Viene inoltre creata la partizione di ripristino di Windows; se non vogliamo includerla possiamo utilizzare il parametro -NoRecoveryTools.
Il risultato è quindi un VHDX già strutturato come un normale disco di sistema Windows, pronto per essere utilizzato come disco di avvio di una macchina virtuale Hyper-V.
Facendo doppio clic sul file VHDX possiamo montarlo direttamente in Windows e visualizzarlo in Gestione disco. Nell’immagine il disco virtuale è il Disco 4, riconoscibile anche dalla caratteristica icona blu. Sono chiaramente visibili la EFI System Partition da 260 MB, la partizione principale contenente Windows e la Recovery Partition da 905 MB. È esattamente il layout che ci serve per avviare Windows in modalità UEFI su una macchina virtuale Hyper-V Generation 2.

Figura 4: Layout delle partizioni del VHDX creato con Convert-Wim2VHD
Integrare aggiornamenti e driver nel VHDX
Una possibilità interessante offerta da Convert-Wim2VHD è quella di personalizzare l’installazione di Windows durante la creazione del disco virtuale, integrando direttamente aggiornamenti e driver. In questo modo possiamo ottenere un VHDX già aggiornato e pronto per essere utilizzato, senza dover avviare prima la macchina virtuale ed effettuare queste operazioni successivamente.
Per integrare un aggiornamento dobbiamo prima scaricare il relativo pacchetto in formato MSU o CAB, verificando naturalmente che sia compatibile con la versione di Windows contenuta nel file WIM. Il pacchetto può quindi essere passato a Convert-Wim2VHD utilizzando il parametro -Package.
Ad esempio:
|
1 2 |
Convert-Wim2VHD -SourcePath $imagepath -Index $index -Path "C:\Base\Windows11PRO-Updated.vhdx" -Size 100GB -Dynamic -DiskLayout UEFI -Package "C:\Updates\Windows11-KBxxxxxxx-x64.msu" -Force |
L’aggiornamento viene applicato offline all’immagine Windows durante la preparazione del VHDX. Il vantaggio è evidente soprattutto quando utilizziamo questi dischi come immagini di base per creare frequentemente nuove macchine virtuali.
Allo stesso modo possiamo integrare anche i driver necessari al sistema operativo. È sufficiente scaricare ed estrarre i driver in una cartella e indicarla tramite il parametro -Driver:
|
1 2 |
Convert-Wim2VHD -SourcePath $imagepath -Index $index -Path "C:\Base\Windows11PRO.vhdx" -Size 100GB -Dynamic -DiskLayout UEFI -Driver "C:\Drivers" -Force |
Possiamo anche combinare le due operazioni e creare direttamente un VHDX aggiornato e completo dei driver:
|
1 2 |
Convert-Wim2VHD -SourcePath $imagepath -Index $index -Path "C:\Base\Windows11PRO-Updated.vhdx" -Size 100GB -Dynamic -DiskLayout UEFI -Package "C:\Updates\Windows11-KBxxxxxxx-x64.msu" -Driver "C:\Drivers" -Force |
Questa possibilità rende Convert-Wim2VHD particolarmente utile per preparare dei dischi VHDX di riferimento, già aggiornati e personalizzati.
Creare automaticamente il file Unattend.xml
Una funzionalità che trovo particolarmente interessante di Convert-Wim2VHD è la possibilità di utilizzare un file Unattend.xml per automatizzare la prima configurazione di Windows. Possiamo quindi preparare il disco virtuale in modo che, al primo avvio della macchina virtuale, vengano applicate automaticamente una serie di impostazioni senza dover completare manualmente tutte le schermate della fase OOBE.
Il modulo WindowsImageTools ci semplifica ulteriormente il lavoro perché mette a disposizione anche il cmdlet New-UnattendXml, che permette di generare direttamente il file di risposta.
Per la mia prova ho deciso di creare un account amministratore locale chiamato AdminLab, configurare il computer con il nome WIN11-DEMO, utilizzare le impostazioni internazionali italiane e impostare il fuso orario italiano.
Possiamo generare il file con un comando PowerShell, senza dover costruire manualmente il contenuto XML.
Per prima cosa creiamo le credenziali dell’account Administrator, richieste dal cmdlet:
|
1 2 |
$AdminCredential = Get-Credential -UserName "Administrator" -Message "Inserisci la password dell'account Administrator" |
Nel caso di un sistema operativo client, come Windows 11, dobbiamo inoltre indicare a New-UnattendXml di abilitare l’account Administrator oppure creare almeno un altro account locale. Per la nostra prova creiamo quindi un account chiamato AdminLab:
|
1 2 |
$UserCredential = Get-Credential -UserName "AdminLab" -Message "Inserisci la password dell'account AdminLab" |
Possiamo ora generare il file Unattend.xml, passando le credenziali dell’account aggiuntivo tramite il parametro -UserAccount:
|
1 2 |
New-UnattendXml -Path "C:\Unattend\Unattend.xml" -AdminCredential $AdminCredential -UserAccount $UserCredential -ComputerName "WIN11-DEMO" -TimeZone "W. Europe Standard Time" -InputLocale "it-IT" -SystemLocale "it-IT" -UserLocale "it-IT" -UILanguage "it-IT" |
Una volta generato il file possiamo naturalmente aprirlo e modificarlo, oltre a verificare quali impostazioni sono state inserite automaticamente dal modulo.
NOTA: il modulo non inserisce semplicemente la password di Administrator come testo leggibile, ma genera il valore utilizzato nel file di risposta a partire dal PSCredential. Le password non vengono memorizzate in chiaro.

Figura 5: File Unattend.xml generato automaticamente con New-UnattendXml
Creazione del VHDX con il file Unattend.xml
Una volta generato il file Unattend.xml, possiamo utilizzarlo durante la creazione del disco virtuale. Non dobbiamo modificare lo script utilizzato precedentemente: è sufficiente aggiungere a Convert-Wim2VHD il parametro -Unattend e indicare il percorso del file di risposta.
Nel mio caso ho utilizzato il seguente comando:
|
1 2 |
Convert-Wim2VHD -SourcePath $imagepath -Index $index -Path "C:\Base\Windows11PRO-Unattended.vhdx" -Size 100GB -Dynamic -DiskLayout UEFI -Unattend "C:\Unattend\Unattend.xml" -Force |
Convert-Wim2VHD crea il VHDX, applica l’immagine di Windows selezionata e inserisce nel disco il file Unattend.xml che abbiamo appena generato.

Figura 6: Creazione del VHDX utilizzando il file Unattend.xml
Dopo aver collegato il VHDX alla macchina virtuale Hyper-V Generation 2, Windows completa automaticamente la configurazione utilizzando il file Unattend.xml. Con whoami e hostname possiamo verificare la creazione dell’account AdminLab e l’assegnazione del nome WIN11-DEMO. I comandi Get-WinUserLanguageList e Get-WinSystemLocale confermano inoltre che sono state applicate correttamente le impostazioni internazionali italiane e il relativo layout di tastiera.

Figura 7: Avvio della macchina virtuale e verifica della configurazione unattended
Avviare Windows direttamente da un disco VHDX
Il disco VHDX che abbiamo creato non deve necessariamente essere utilizzato con Hyper-V. Windows supporta infatti il Native Boot da VHDX, che permette di avviare il sistema operativo contenuto nel disco virtuale direttamente su un computer fisico, senza creare una macchina virtuale.
Questa possibilità è particolarmente interessante per creare ambienti di test o laboratorio mantenendo separata l’installazione principale di Windows. Il sistema operativo viene eseguito direttamente sull’hardware del computer, mentre tutti i suoi file rimangono contenuti all’interno del VHDX. Sapevate che questa funzionalità è disponibile da Windows 7?
Per questa prova ho copiato il disco creato precedentemente nella cartella C:\VHD\Windows11PRO.vhdx di una macchina esistente (può essere anche una VM).
Il vantaggio è che non dobbiamo creare una nuova partizione dedicata né modificare quella contenente l’installazione principale: il nuovo ambiente Windows rimane all’interno di un singolo file VHDX.

Figura 8: Disco VHDX pronto per la configurazione del Native Boot
A questo punto dobbiamo montare il VHDX per rendere accessibile l’installazione di Windows contenuta al suo interno. Possiamo farlo direttamente con un doppio clic.
Dopo il montaggio Windows assegnerà automaticamente una lettera alla partizione principale del disco virtuale. Supponiamo, ad esempio, che alla partizione Windows venga assegnata la lettera E:. Possiamo verificare che sia quella corretta controllando la presenza della directory E:\Windows.

Figura 9: VHDX montato e installazione di Windows accessibile
A questo punto utilizziamo BCDBoot per aggiungere l’installazione contenuta nel VHDX al Windows Boot Manager del computer:
|
1 2 |
bcdboot E:\Windows |
BCDBoot copia i file necessari all’avvio e crea una nuova voce nel BCD (Boot Configuration Data). Al successivo riavvio avremo quindi la possibilità di scegliere tra il sistema operativo installato normalmente sul computer e quello contenuto nel VHDX.
Possiamo verificare il risultato con:
|
1 2 |
bcdedit /enum |
Come si può vedere dalla figura sotto, sono ora presenti due voci Windows Boot Loader: {current} identifica Windows attualmente in esecuzione, mentre la nuova voce {default} punta alla partizione E:, cioè all’installazione contenuta nel VHDX.

Figura 10: Aggiunta dell’installazione Windows al Boot Manager
Dopo aver aggiunto l’installazione con BCDBoot, possiamo rendere più facilmente riconoscibile il nuovo sistema operativo modificando la descrizione della voce {default} con BCDEdit:
|
1 2 |
bcdedit /set "{default}" description "Windows 11 PRO - Boot da VHDX" |
Eseguendo nuovamente bcdedit /enum possiamo verificare la modifica. Nell’immagine sono chiaramente distinguibili Windows 11, che corrisponde al sistema attualmente in esecuzione, e Windows 11 PRO – Boot da VHDX, che identifica la nuova installazione.

Figura 11: Personalizzazione della voce nel Windows Boot Manager
Al riavvio del computer viene visualizzato il Windows Boot Manager, dal quale possiamo scegliere se avviare l’installazione principale di Windows 11 oppure Windows 11 PRO – Boot da VHDX. Per impostazione predefinita abbiamo 30 secondi per effettuare la scelta, trascorsi i quali viene avviato automaticamente il sistema operativo predefinito.
Il tempo di attesa può essere modificato facilmente con BCDEdit. Ad esempio, per portarlo a 10 secondi possiamo utilizzare:
|
1 2 |
bcdedit /timeout 10 |
In questo modo abbiamo realizzato un vero ambiente dual boot, con la particolarità che la seconda installazione di Windows è contenuta interamente all’interno di un file VHDX.

Figura 12: Scelta del sistema operativo dal Windows Boot Manager
Dopo aver effettuato il boot dal VHDX, possiamo notare che il sistema operativo contenuto nel disco virtuale utilizza correttamente la lettera C:, mentre la partizione contenente l’installazione originale di Windows riceve la prima lettera disponibile, nel mio caso D:.
Un aspetto importante riguarda i VHDX dinamici. Durante il Native Boot, Windows riserva sul disco fisico lo spazio corrispondente alla dimensione massima configurata per il VHDX. Nel mio caso il disco virtuale può raggiungere 100 GB e, come si vede nell’immagine, il file viene temporaneamente portato a circa quella dimensione. Questo comportamento serve a garantire che il VHDX possa crescere fino alla capacità prevista mentre il sistema operativo è in esecuzione.
Riavviando invece il computer con il Windows originale, il VHDX dinamico viene riportato alla sua dimensione fisica effettivamente utilizzata, che normalmente sarà inferiore ai 100 GB massimi configurati. Assicuratevi quindi di avere spazio libero sufficiente sul disco fisico che ospita il VHDX, considerando non la dimensione che il file occupa normalmente, ma la sua dimensione massima configurata.
Potete naturalmente cambiare in qualsiasi momento il sistema operativo predefinito e l’ordine delle voci presenti nel menu di avvio. Da riga di comando potete utilizzare BCDEdit, mentre se preferite un’interfaccia grafica potete aprire Configurazione di sistema eseguendo msconfig e utilizzare la scheda Opzioni di avvio. Da qui potete scegliere il sistema operativo da avviare per impostazione predefinita, modificare il timeout oppure eliminare eventuali voci che non servono più.

Figura 13: Windows avviato direttamente dal VHDX
Conclusioni
WindowsImageTools permette di semplificare notevolmente la creazione di dischi VHDX avviabili, evitando di dover installare Windows manualmente ogni volta che dobbiamo preparare una nuova macchina virtuale.
Con Convert-Wim2VHD possiamo partire direttamente dal file install.wim di Windows e ottenere un disco già configurato per l’avvio UEFI, con la possibilità di integrare aggiornamenti, driver e file Unattend.xml.
L’utilizzo di New-UnattendXml rende il processo ancora più interessante, perché permette di automatizzare anche la prima configurazione del sistema operativo. Il risultato è un VHDX che possiamo collegare a una nuova macchina virtuale Hyper-V Generation 2 e avviare immediatamente, riducendo sensibilmente i tempi necessari per creare nuovi ambienti di test e laboratorio.
La chicca finale è sicuramente il Native Boot da VHDX. Lo stesso disco che utilizziamo con Hyper-V può essere aggiunto al Windows Boot Manager e avviato direttamente sull’hardware del computer, senza creare una partizione dedicata e senza utilizzare una macchina virtuale. In questo modo possiamo avere più installazioni di Windows mantenendo ciascun ambiente all’interno di un semplice file VHDX.