最近公司需要做Hyper-V的遠程管理,在現有產品基礎上擴展對Hyper V的管理,實現遠程開關機、遠程開啟虛擬機會話,其他內容可查看MSDN中有對Hyper-V的描述和相關實例代碼、 Wmi操作hyper的工具類 、hyper-V
ok,廢話不說,正文開始...
1.安裝hyper-v虛擬機,這里安裝的是2012版,安裝好之后創建兩個虛擬機
2.查閱了好多資料,通用的方式是用Wmi來與hyper進行數據交互,通過工具掃描一下hyper的wmi節點
發現一共有22個直屬類
每個類都逐個查看一下,發現能夠交互的只有3個大類
逐個調用一下:
1 [dynamic: ToInstance, provider("VmmsWmiInstanceAndMethodProvider"), Locale(1033)] 2 class Msvm_ComputerSystem : CIM_ComputerSystem 3 { 4 [read, ArrayType("Indexed")] uint16 AssignedNumaNodeList[]; 5 [read, Units("MilliSeconds")] uint64 OnTimeInMilliseconds; 6 [read] uint32 ProcessID; 7 [read] datetime TimeOfLastConfigurationChange; 8 [Implemented, ValueMap{"0", "4096", "32768", "32769", "32770", "32771", "32772", "32773", "32774", "32775", "32776", "32777", "32778"}, Bypass_GetObject, ModelCorrespondence{"CIM_EnabledLogicalElement.RequestedState"}] uint32 RequestStateChange([IN, ValueMap{"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "..", "32768..65535"}, ModelCorrespondence{"CIM_EnabledLogicalElement.RequestedState"}] uint16 RequestedState, [OUT] CIM_ConcreteJob ref Job, [IN, SubType("Interval"): ToInstance ToSubClass] datetime TimeoutPeriod); 9 };
其中:
"0", "4096", "32768", "32769", "32770", "32771", "32772", "32773", "32774", "32775", "32776", "32777", "32778"
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "..", "32768..65535"
這些數字分別代表虛擬機實例的各個狀態,如:運行,關機,正在關機,等等。如:

0 Unknown 2 Running 3 Off 32768 Paused 32769 Suspended 32770 Starting 32771 Snapshotting 32772 Migrating 32773 Saving 32774 Stopping 32775 Deleted 32776 Pausing 32777 Resuming
保存虛擬機數據的類為 Msvm_ComputerSystem,通過調用Msvm_ComputerSystem可以獲取遠程hyper下各虛擬機信息,該類包含宿主機的描述:
instance of Msvm_ComputerSystem { AssignedNumaNodeList = NULL; Caption = "宿主計算機系統"; CreationClassName = "Msvm_ComputerSystem"; Dedicated = NULL; Description = "Microsoft 宿主計算機系統"; ElementName = "HYPER-V"; EnabledDefault = 2; EnabledState = 2; HealthState = 5; IdentifyingDescriptions = NULL; InstallDate = NULL; Name = "HYPER-V"; NameFormat = NULL; OnTimeInMilliseconds = NULL; OperationalStatus = {2}; OtherDedicatedDescriptions = NULL; OtherEnabledState = NULL; OtherIdentifyingInfo = NULL; PowerManagementCapabilities = NULL; PrimaryOwnerContact = NULL; PrimaryOwnerName = NULL; ProcessID = NULL; RequestedState = 12; ResetCapability = 1; Roles = NULL; Status = "OK"; StatusDescriptions = {"確定"}; TimeOfLastConfigurationChange = NULL; TimeOfLastStateChange = NULL; };
虛擬機的描述:

instance of Msvm_ComputerSystem { AssignedNumaNodeList = {0}; Caption = "虛擬機"; CreationClassName = "Msvm_ComputerSystem"; Dedicated = NULL; Description = "Microsoft 虛擬機"; ElementName = "windows2012"; EnabledDefault = 2; EnabledState = 2; HealthState = 5; IdentifyingDescriptions = NULL; InstallDate = "20160719031827.000000-000"; Name = "F6F52FD7-42B6-4C2D-BADC-C61F9B5FFD21"; NameFormat = NULL; OnTimeInMilliseconds = "9193908"; OperationalStatus = {2}; OtherDedicatedDescriptions = NULL; OtherEnabledState = NULL; OtherIdentifyingInfo = NULL; PowerManagementCapabilities = NULL; PrimaryOwnerContact = NULL; PrimaryOwnerName = NULL; ProcessID = 4064; RequestedState = 12; ResetCapability = 1; Roles = NULL; Status = "OK"; StatusDescriptions = {"正常運行"}; TimeOfLastConfigurationChange = "20160719084459.532773-000"; TimeOfLastStateChange = "20160719084459.000000-000"; };

instance of Msvm_ComputerSystem { AssignedNumaNodeList = {}; Caption = "虛擬機"; CreationClassName = "Msvm_ComputerSystem"; Dedicated = NULL; Description = "Microsoft 虛擬機"; ElementName = "win2008"; EnabledDefault = 2; EnabledState = 3; HealthState = 5; IdentifyingDescriptions = NULL; InstallDate = "20160719081005.000000-000"; Name = "7A591782-9EEC-46CD-AE43-AFE4EFD23390"; NameFormat = NULL; OnTimeInMilliseconds = "0"; OperationalStatus = {2}; OtherDedicatedDescriptions = NULL; OtherEnabledState = NULL; OtherIdentifyingInfo = NULL; PowerManagementCapabilities = NULL; PrimaryOwnerContact = NULL; PrimaryOwnerName = NULL; ProcessID = NULL; RequestedState = 12; ResetCapability = 1; Roles = NULL; Status = "OK"; StatusDescriptions = {"正常運行"}; TimeOfLastConfigurationChange = "20160719104106.665157-000"; TimeOfLastStateChange = "20160719104106.000000-000"; };
虛擬機信息獲取完畢!