2014-02-27 32 views
1

在Hyper-V 2008 R2和Hyper-V 2012中,我使用以下代碼查找與VHD文件關聯的VM名稱。它工作得很好Msvm_ResourceAllocationSettingData類屬性連接中的Hyper-V 2012 R2 WMI錯誤

功能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 

端功能

事情工作正常,除了資源類型'微軟虛擬硬盤'不存在了。這是一個「微軟:Hyper-V:合成磁盤驅動器」現在硬盤。 當我更改代碼以反映新名稱時,我無法從Instance.Connection(0)中獲取對象。 類型不匹配碼錯誤代碼800A000D

任何人都可以幫助我得到這個腳本在2012 R2的工作?或PowerShell腳本中的任何幫助

回答

2

2012R2 VHD文件路徑位於Msvm_StorageAllocationSettingData.HostResource字段中。 這是隻有第一個元素有效的字符串數組 - Msvm_StorageAllocationSettingData

所以你基本上需要找到相應的Msvm_StorageAllocationSettingData instacnce和 從HostResource數組中提取第一個字符串。 我不擅長VB或PowerShell,所以不能給你任何有用的代碼。

+0

感謝您的提示。我真的在尋找很久。這裏有人發佈了一個更完整的例子:https://social.msdn.microsoft.com/Forums/windowsserver/en-US/a7c58caa-5efa-408f-bb73-5e72dd22f43c/hyperv-wmi-provider-v2-msvmresourceallocationsettingdata-class?論壇= servervirtualization –