四 012009
连接到服务器上之后,第一步要做的当然是拿到虚拟机的列表了:
1 2 3 4 5 6 7 8 | private ManagementObjectCollection RefreshVirtualMachines() { ManagementScope scope = new ManagementScope(@"\\" + ServerName + @"\root\virtualization"); scope.Connect(); ObjectQuery query = new ObjectQuery("SELECT * FROM MsVM_ComputerSystem WHERE Caption LIKE 'Virtual%' "); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); return searcher.Get(); } |
很简单吧,一个查询就搞定了。得到的ManagementObjectCollection中的每个ManagementObject,对应一个虚拟机的数据。接下来就是生成虚拟机的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | public class VirtualMachine { internal VirtualMachine(ManagementObject obj) { BaseObject = obj; } private ManagementObject BaseObject { get; set; } public string Name { get { return BaseObject.GetPropertyValue("ElementName").ToString(); } } public VirtualMachineState State { get { return VirtualMachineState.GetState(BaseObject.GetPropertyValue("EnabledState").ToString()); } } public Guid Id { get { return new Guid(BaseObject.GetPropertyValue("Name").ToString()); } } public TimeSpan UpTime { get { return TimeSpan.FromMilliseconds((double)(ulong)BaseObject.GetPropertyValue("OnTimeInMilliseconds")); } } } |
每个ManagementObject中包含一个虚拟机的数据,详细的列表在这里。不过我只找到4个有用的:Name, ElementName, EnabledState和OnTimeInMilliseconds:
- Name是一个GUID,它是虚拟机的标识符。
- ElementName相当于Display Name,也就是用户所看到的名字。
- EnabledState是虚拟机当前的状态,有很多,详见后面的代码。
- OnTimeInMilliseconds表示虚拟机开启了多少时间。OnTimeInMilliseconds indicates how long the virtual machine is on.
EnabledState是一个字符串形式的数字,要把它转换成用户看得懂的数据,还需要一个类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | public class VirtualMachineState { private VirtualMachineState(ushort id, string name, string displayName) { Id = id; Name = name; DisplayName = displayName; } public string Name { get; private set; } public ushort Id { get; private set; } public string DisplayName { get; private set; } public override string ToString() { return DisplayName + " (" + Id + ")"; } public static VirtualMachineState GetState(string name) { ushort id = 0; bool useId = UInt16.TryParse(name, out id); foreach (VirtualMachineState state in states) { if ((useId && state.Id == id) || (state.Name == name)) { return state; } } return Unknown; } private static List states = new List(); static VirtualMachineState() { states.Add(Unknown); states.Add(Enabled); states.Add(Disabled); states.Add(Paused); states.Add(Suspended); states.Add(Starting); states.Add(Sanpshotting); states.Add(Saving); states.Add(Stopping); states.Add(Pausing); states.Add(Resuming); } public static VirtualMachineState Unknown = new VirtualMachineState(0, "Unknown", "Unknown"); public static VirtualMachineState Enabled = new VirtualMachineState(2, "Enabled", "Running"); public static VirtualMachineState Disabled = new VirtualMachineState(3, "Diabled", "Off"); public static VirtualMachineState Paused = new VirtualMachineState(32768, "Paused", "Paused"); public static VirtualMachineState Suspended = new VirtualMachineState(32769, "Suspended", "Saved"); public static VirtualMachineState Starting = new VirtualMachineState(32770, "Starting", "Starting"); public static VirtualMachineState Sanpshotting = new VirtualMachineState(32771, "Snapshotting", "Snapshooting"); public static VirtualMachineState Saving = new VirtualMachineState(32773, "Saving", "Saving"); public static VirtualMachineState Stopping = new VirtualMachineState(32774, "Stopping", "Shuting down"); public static VirtualMachineState Pausing = new VirtualMachineState(32776, "Pausing", "Pausing"); public static VirtualMachineState Resuming = new VirtualMachineState(32777, "Resuming", "Resuming"); } |
用VirtualMachineState.GetState把ManagementObject里的EnableState转化成VirtualMachineState。一共有11种可能的状态,最常见的Enabled和Disabled,即开着和关着。
这样就可以获取服务器上的所有虚拟机的信息,然后显示给用户了。
您还可能感兴趣的日志: