在Hyper-V 2008 R2和Hyper-V 2012中,我使用以下代码来查找与VHD文件关联的VM名称。工作正常
函数strGetVMname(strVHD)
设置VMList = objWMIService.ExecQuery(“SELECT * FROM Msvm_ComputerSystem其中标题=“虚拟机””)
For Each VirtualMachine in VMList
Set vm = GetComputerSystem(VirtualMachine.ElementName)
strQuery = "ASSOCIATORS OF {" & vm.Path_.Path & "} WHERE resultClass = Msvm_VirtualSystemSettingData"
set virtualSystemSetting = objWMIService.ExecQuery(strQuery).ItemIndex(0)
strQuery = Format1("ASSOCIATORS OF {{0}} WHERE " &_
" resultClass = Msvm_ResourceAllocationSettingData" &_
" AssocClass = Msvm_VirtualSystemSettingDataComponent " &_
" ResultRole = PartComponent " &_
" Role = GroupComponent", virtualSystemSetting.Path_.Path)
set objInstances = objWMIService.ExecQuery(strQuery)
for each Instance in objInstances
If (Instance.ResourceSubType = "Microsoft Virtual Hard Disk") Then
strMatch = InStr(1,Instance.Connection(0),strVHD,1)
If (strMatch = 1) Then
strGetVMname = VirtualMachine.ElementName
exit for
End If
End If
next
Next
结束功能
这在Hyper-V 2012 R2中不再起作用。我注意到WMI服务已更改为\。\ root \ virtualization \ v2。所以我更改了代码
函数strGetVMname(strVHD)
设置VMList = objWMIService.ExecQuery(“SELECT * FROM Msvm_ComputerSystem其中标题=“虚拟机””)
For Each VirtualMachine in VMList
Set vm = GetComputerSystem(VirtualMachine.ElementName)
strQuery = "ASSOCIATORS OF {" & vm.Path_.Path & "} WHERE resultClass = Msvm_VirtualSystemSettingData"
set virtualSystemSetting = objWMIService.ExecQuery(strQuery).ItemIndex(0)
strQuery = Format1("ASSOCIATORS OF {{0}} WHERE " &_
" resultClass = Msvm_ResourceAllocationSettingData" &_
" AssocClass = Msvm_VirtualSystemSettingDataComponent " &_
" ResultRole = PartComponent " &_
" Role = GroupComponent", virtualSystemSetting.Path_.Path)
set objInstances = objWMIService.ExecQuery(strQuery)
for each Instance in objInstances
If (Instance.ResourceSubType = "Microsoft:Hyper-V:Synthetic Disk Drive") Then
strMatch = InStr(1,Instance.Connection(0),strVHD,1)
If (strMatch = 1) Then
strGetVMname = VirtualMachine.ElementName
exit for
End If
End If
next
Next
结束功能
然后一切正常,除了资源类型“Microsoft Virtual Hard Disk”不再存在。现在是“Microsoft:Hyper-V:合成磁盘驱动器” 硬盘驱动器。 当我更改代码以反射(reflect)为新名称时,无法再从Instance.Connection(0)获取对象。
类型不匹配代码800A000D在同一行出现错误
谁能帮助我让此脚本在2012 R2中运行?或Powershell脚本中的任何帮助
最佳答案
在2012R2中,VHD文件路径位于Msvm_StorageAllocationSettingData.HostResource字段中。
这是一个字符串数组,其中只有第一个元素有效-Msvm_StorageAllocationSettingData。
因此,您基本上需要找到相应的Msvm_StorageAllocationSettingData实例和
从HostResource数组中提取第一个字符串。
我对VB或PowerShell不太满意,因此无法提供任何有用的代码。