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,即开着和关着。

这样就可以获取服务器上的所有虚拟机的信息,然后显示给用户了。

您还可能感兴趣的日志:

  1. Hyper-V的自动化 (0) 远程连接
  2. C#中重载相等运算符
  3. Hyper V中的快捷键
  4. 从32位应用程序访问64位注册表
  5. PowerShell Cmdlet的测试 (二) 获取结果
  6. 在C#中使用@声明变量 – 逐字标识符
  7. 《编程方法》习题1
  8. PowerShell Cmdlet的测试 (一)SDK

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>