Hyper-V WMI: What VHD’s/Physical Disks Are Associated With a Virtual Machine?

I  got a great question based on yesterday’s post (by the way my e-mail was blocking a lot of external messages that’s fixed now so I apologize to anyone I missed a mail from).  The person was asking how they could figure out what physical disk a virtual machine is using when configured for passthough on the host…  Well here’s the magic – I took it a little further and got the path’s for any attached VHD’s…  Enjoy!

 

$HyperVParent = "localhost" $HyperVGuest = "My Virtual Machine" $VMManagementService = Get-WmiObject -class "Msvm_VirtualSystemManagementService" -namespace "root\virtualization" -ComputerName $HyperVParent $Vm = Get-WmiObject -Namespace "root\virtualization" -ComputerName $HyperVParent -Query "Select * From Msvm_ComputerSystem Where ElementName='$HyperVGuest'" $VMSettingData = Get-WmiObject -Namespace "root\virtualization" -Query "Associators of {$Vm} Where ResultClass=Msvm_VirtualSystemSettingData AssocClass=Msvm_SettingsDefineState" -ComputerName $HyperVParent # #Getting the Path's for Attached VHD's $VirtualDiskResource = Get-WmiObject -Namespace "root\virtualization" `     -Query "Associators of {$VMSettingData} Where ResultClass=Msvm_ResourceAllocationSettingData AssocClass=Msvm_VirtualSystemSettingDataComponent" `     -ComputerName $HyperVParent | Where-Object { $_.ResourceSubType -match "Microsoft Virtual Hard Disk" } ForEach-Object -InputObject $VirtualDiskResource -Process {     Write-Host "Virtual Hard Disk At: $_.Connection[0]" } # #Getting the Disk Attachments for Passthrough Disks $PhysicalDiskResource = Get-WmiObject -Namespace "root\virtualization" `     -Query "Associators of {$VMSettingData} Where ResultClass=Msvm_ResourceAllocationSettingData AssocClass=Msvm_VirtualSystemSettingDataComponent" `     -ComputerName $HyperVParent | Where-Object { $_.ResourceSubType -match "Microsoft Physical Disk Drive" } ForEach-Object -InputObject $PhysicalDiskResource -Process {     Write-Host "Passthrough Disk At: " ([WMI]$_.HostResource[0]).ElementName     Write-Host "Passthrough Disk Drive Number: " ([WMI]$_.HostResource[0]).DriveNumber }

 

Taylor Brown
Hyper-V Integration Test Lead
https://blogs.msdn.com/taylorb

clip_image001

Comments

  • Anonymous
    August 21, 2008
    PingBack from http://hubsfunnywallpaper.cn/?p=1812

  • Anonymous
    August 29, 2008
    Very handy script by Taylor Brown I got a great question based on yesterday’s post (by the way my e-mail

  • Anonymous
    September 09, 2008
    You are asking Hyper-V parent's Hyper-V WMI provider to answer which one is VHD / passthrough disk. Without asking parent, how to detect?   =========================================
    Without asking the parent you can't detect this information. -Taylor

  • Anonymous
    November 13, 2008
    If anyone is trying to do this in VBScript then here's the code: strComputer = "" Set objWMIService = GetObject("winmgmts:" & strComputer & "rootvirtualization") Set colSystems = objWMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemSettingData", _                                       "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly) For Each objSystem In colSystems   WScript.Echo "ElementName: " & objSystem.ElementName   Set colResData = objWMIService.ExecQuery("Associators of {Msvm_VirtualSystemSettingData='" & objSystem.InstanceID & "'} Where ResultClass=Msvm_ResourceAllocationSettingData AssocClass=Msvm_VirtualSystemSettingDataComponent", _                                       "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)   For Each objResData In colResData      If objResData.ResourceSubType = "Microsoft Virtual Hard Disk" Then         strConnection = Join(objResData.Connection, ",")         WScript.Echo "  Connection: " & strConnection      End If   Next Next

  • Anonymous
    February 16, 2009
    This is a follow up on my previous post on Hyper-V WMI: What VHD’s/Physical Disks Are Associated With

  • Anonymous
    June 16, 2011
    is there an easy way to determine the type of a virtual disk - ie. fixed, dynamic, differencing? and if differencing - what is the parent?

  • Anonymous
    January 09, 2014
    First of all thank you for putting together this script. I am somewhat of a novice with powershell scripts and am having an issue determining why I am getting the results back that I am getting. I am trying to run this script against a host with 50+ passthrough disks and a vm that uses 4 or 5 of those disks. I only get results for the first disk. I see the last function in the script is to loop through, but its only returning the first listed disk