在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不太满意,因此无法提供任何有用的代码。

07-24 09:44
查看更多