A virtual machine in Hyper-V consists of a few files that account for its virtual hardware configuration and the virtual storage (VHD and VHDX files).  By default the virtual machine configuration files are stored in_C:\ProgramData\Microsoft\Windows\Hyper-V_, and the virtual hard drives are stored in C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks.

One slight improvement in Hyper-V (in Windows Server 2012) is that during the installation process (GUI mode only) it gives you the option of changing these defaults.  However the defaults are still the same as they used to be… on the C drive.

Being cheap I only have a ‘tiny’ SSD (ok folks I bought it years ago and it felt like it was a fortune back then…) as C:\, all other data is still on rusty spindles on my home lab.

VMs, I know are important but are small are still on the C:\ however others I had to move off.

Now tiering storage is fine, it is a PITA to find where which VHD/VHDX is stored via GUI. The fastest way I found to scavenger your lost treas… um VHDs is of course Powershell.

# Run as admin
Get-VMHardDiskDrive * | Select VMName, Path

then being a little OCD…, I like to sort it after names. An example can look like this:

PS C:\WINDOWS\system32> Get-VMHardDiskDrive * | select vmname, path | Sort-Object VMName

VMName    Path
------    ----
2016      E:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\2016.vhdx
CentOS_01 C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\CentOS_01.vhdx
CentOS_02 C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\CentOS_02.vhdx
CentOS_03 C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\CentOS_03.vhdx
CentOS_04 C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\CentOS_04.vhdx
DC01      E:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\DC01.vhdx
DC02      E:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\DC02.vhdx
Kali      E:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\Kali.vhdx
SCCM01    E:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\SCCM01.vhdx
SCCM02    C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\SCCM02.vhdx
SpiceW    E:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\SpiceW.vhdx

Now, that is not bad, what if I need more info, let’s say also the VMID so you can quickly RDP into the VM (see my post about RDCMan).

Easy, Get-VMHardDiskDrive does not have the info about the VMID, Get-VM however does, so we can just pipe that in it like so:

Get-VM * | Get-VMHardDiskDrive | Select vmname,vmid,path | Sort-Object vmname

That will give us a nice list with the VMname, VMID and VHD(x) path.

Another thing to mention. if you wan to change the default location of your VM Disks, or even of the machines, Powershell can do that as well:

SET-VMHOST –computername <server> –virtualharddiskpath 'C:\VHDs'
SET-VMHOST –computername <server> –virtualmachinepath 'C:\VMs'

or via GUI of course in the Hyper-V settings: