工具类如下:
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; } }}
C# 实现 Hyper-V 虚拟机 管理,布布扣,bubuko.com
时间: 2024-12-28 17:19:52