sunage001 发表于 2015-4-2 15:19:44

C# 实现 Hyper-V 虚拟机 管理

本帖最后由 wuyvzhang 于 2016-8-2 17:27 编辑 <br /><br />  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 GetVMSnapShotList(string vmName)
      {
            List shotList = new List();
            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;
      }
    }
    ///
    ///-      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"
    ///
    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;
      }
    }
}
  

www.138075.com SO娱乐城:真_人.足球.彩票齐全| 开户送10元.首存送58元.手机可投ㄩ注任何游戏顶级信用ㄩ提现即时到账SO.CC
页: [1]
查看完整版本: C# 实现 Hyper-V 虚拟机 管理