原文:C# 实现 Hyper-V 虚拟机 管理
Hyper-V WMI Provider
工具类如下:
using System;using System.Collections.Generic;using System.Management; namespace MyNamespace{#region Return Value of RequestStateChange Method of the Msvm_ComputerSystem Class//Return Value of RequestStateChange Method of the Msvm_ComputerSystem Class //This method returns one of the following values.//Completed with No Error (0)//DMTF Reserved (7–4095) //Method Parameters Checked - Transition Started (4096)//Failed (32768) //Access Denied (32769) //Not Supported (32770) //Status is unknown (32771) //Timeout (32772) //Invalid parameter (32773) //System is in use (32774) //Invalid state for this operation (32775) //Incorrect data type (32776) //System is not available (32777) //Out of memory (32778) #endregion public class VMManagement {private static string hostServer = "hostServer";private static string userName = "username";private static string password = "password"; public static string HostServer {get;set; } public static string UserName {get;set; } public static string Password {get;set; } public static VMState GetVMState(string vmName) { VMState vmState = VMState.Undefined; ConnectionOptions co = new ConnectionOptions(); co.Username = userName; co.Password = password; ManagementScope manScope = new ManagementScope(string.Format(@"\\{0}\root\virtualization", hostServer), co); manScope.Connect(); ObjectQuery queryObj = new ObjectQuery("SELECT * FROM Msvm_ComputerSystem"); ManagementObjectSearcher vmSearcher = new ManagementObjectSearcher(manScope, queryObj); ManagementObjectCollection vmCollection = vmSearcher.Get(); foreach (ManagementObject vm in vmCollection) {if (string.Compare(vm["ElementName"].ToString(), vmName, true) == 0) { vmState = ConvertStrToVMState(vm["EnabledState"].ToString());break; } } return vmState; } public static bool StartUp(string vmName) { return ChangeVMState(vmName, VMState.Enabled); } public static bool ShutDown(string vmName) {return ChangeVMState(vmName, VMState.Disabled); } public static bool RollBack(string vmName, string snapShotName) { ConnectionOptions co = new ConnectionOptions(); co.Username = userName; co.Password = password; ManagementScope manScope = new ManagementScope(string.Format(@"\\{0}\root\virtualization", hostServer), co); manScope.Connect(); ObjectQuery queryObj = new ObjectQuery("SELECT * FROM Msvm_ComputerSystem"); ManagementObjectSearcher vmSearcher = new ManagementObjectSearcher(manScope, queryObj); ManagementObjectCollection vmCollection = vmSearcher.Get(); object opResult = null;// loop the virtual machines foreach (ManagementObject vm in vmCollection) {// find the vmName virtual machine, then get the list of snapshot if (string.Compare(vm["ElementName"].ToString(), vmName, true) == 0) { ObjectQuery queryObj1 = new ObjectQuery(string.Format("SELECT * FROM Msvm_VirtualSystemSettingData WHERE SystemName='{0}' and SettingType=5", vm["Name"].ToString())); ManagementObjectSearcher vmSearcher1 = new ManagementObjectSearcher(manScope, queryObj1); ManagementObjectCollection vmCollection1 = vmSearcher1.Get(); ManagementObject snapshot = null;// find and record the snapShot object foreach (ManagementObject snap in vmCollection1) {if (string.Compare(snap["ElementName"].ToString(), snapShotName, true) == 0) { snapshot = snap;break; } } ObjectQuery queryObj2 = new ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService"); ManagementObjectSearcher vmSearcher2 = new ManagementObjectSearcher(manScope, queryObj2); ManagementObjectCollection vmCollection2 = vmSearcher2.Get(); ManagementObject virtualSystemService = null;foreach (ManagementObject o in vmCollection2) { virtualSystemService = o;break; } if (ConvertStrToVMState(vm["EnabledState"].ToString()) != VMState.Disabled) { ShutDown(vm["ElementName"].ToString()); } opResult = virtualSystemService.InvokeMethod("ApplyVirtualSystemSnapShot", new object[] { vm.Path, snapshot.Path });break; } } return "0" == opResult.ToString(); } public static List<SnapShot> GetVMSnapShotList(string vmName) { List<SnapShot> shotList = new List<SnapShot>(); ConnectionOptions co = new ConnectionOptions(); co.Username = userName; co.Password = password; ManagementScope manScope = new ManagementScope(string.Format(@"\\{0}\root\virtualization", hostServer), co); manScope.Connect(); ObjectQuery queryObj = new ObjectQuery("SELECT * FROM Msvm_ComputerSystem"); ManagementObjectSearcher vmSearcher = new ManagementObjectSearcher(manScope, queryObj); ManagementObjectCollection vmCollection = vmSearcher.Get(); string str = "";// loop through the machines foreach (ManagementObject vm in vmCollection) { str += "Snapshot of " + vm["ElementName"].ToString() + "\r\n";//Get the snaplist if (string.Compare(vm["ElementName"].ToString(), vmName, true) == 0) { ObjectQuery queryObj1 = new ObjectQuery(string.Format("SELECT * FROM Msvm_VirtualSystemSettingData WHERE SystemName='{0}' and SettingType=5", vm["Name"].ToString())); ManagementObjectSearcher vmSearcher1 = new ManagementObjectSearcher(manScope, queryObj1); ManagementObjectCollection vmCollection1 = vmSearcher1.Get(); foreach (ManagementObject snap in vmCollection1) { SnapShot ss = new SnapShot(); ss.Name = snap["ElementName"].ToString(); ss.CreationTime = DateTime.ParseExact(snap["CreationTime"].ToString().Substring(0, 14), "yyyyMMddHHmmss", null).ToLocalTime(); ss.Notes = snap["Notes"].ToString(); shotList.Add(ss); } } } return shotList; } private static bool ChangeVMState(string vmName, VMState toState) {string toStateCode = ConvertVMStateToStr(toState);if (toStateCode == string.Empty)return false; ConnectionOptions co = new ConnectionOptions(); co.Username = userName; co.Password = password; ManagementScope manScope = new ManagementScope(string.Format(@"\\{0}\root\virtualization", hostServer), co); manScope.Connect(); ObjectQuery queryObj = new ObjectQuery("SELECT * FROM Msvm_ComputerSystem"); ManagementObjectSearcher vmSearcher = new ManagementObjectSearcher(manScope, queryObj); ManagementObjectCollection vmCollection = vmSearcher.Get(); object o = null;foreach (ManagementObject vm in vmCollection) {if (string.Compare(vm["ElementName"].ToString(), vmName, true) == 0) { o = vm.InvokeMethod("RequestStateChange", new object[] { toStateCode });break; } }return "0" == o.ToString(); } private static VMState ConvertStrToVMState(string statusCode) { VMState vmState = VMState.Undefined; switch (statusCode) {case "0": vmState = VMState.Unknown;break;case "2": vmState = VMState.Enabled;break;case "3": vmState = VMState.Disabled;break;case "32768": vmState = VMState.Paused;break;case "32769": vmState = VMState.Suspended;break;case "32770": vmState = VMState.Starting;break;case "32771": vmState = VMState.Snapshotting;break;case "32773": vmState = VMState.Saving;break;case "32774": vmState = VMState.Stopping;break;case "32776": vmState = VMState.Pausing;break;case "32777": vmState = VMState.Resuming;break; } return vmState; } private static string ConvertVMStateToStr(VMState vmState) {string status = string.Empty;switch (vmState) {case VMState.Unknown: status = "0";break;case VMState.Enabled: status = "2";break;case VMState.Disabled: status = "3";break;case VMState.Paused: status = "32768";break;case VMState.Suspended: status = "32769";break;case VMState.Starting: status = "32770";break;case VMState.Snapshotting: status = "32771";break;case VMState.Saving: status = "32773";break;case VMState.Stopping: status = "32774";break;case VMState.Pausing: status = "32776";break;case VMState.Resuming: status = "32777";break; } return status; } } /// <summary>///- Undefined --> "Not defined"///0 Unknown --> "Unknown"///2 Enabled --> "Running" ///3 Diabled --> "Off"///32768 Paused --> "Paused"///32769 Suspended --> "Saved"///32770 Starting --> "Starting"///32771 Snapshotting --> "Snapshooting///32773 Saving --> "Saving"///32774 Stopping --> "Shuting down///32776 Pausing --> "Pausing"///32777 Resuming --> "Resuming"/// </summary> public enum VMState { Undefined, Unknown, Enabled, Disabled, Paused, Suspended, Starting, Snapshotting, Saving, Stopping, Pausing, Resuming } public class SnapShot {public string Name {get;set; } public DateTime CreationTime {get;set; } public string Notes {get;set; } }}
时间: 2025-01-29 15:21:00