C# 实现 Hyper-V 虚拟机 管理
工具类如下:
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) == )
{
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) == )
{
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) == )
{
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 "" == 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) == )
{
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(, ), "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) == )
{
o = vm.InvokeMethod("RequestStateChange", new object[] { toStateCode });
break;
}
}
return "" == o.ToString();
}
private static VMState ConvertStrToVMState(string statusCode)
{
VMState vmState = VMState.Undefined;
switch (statusCode)
{
case "":
vmState = VMState.Unknown;
break;
case "":
vmState = VMState.Enabled;
break;
case "":
vmState = VMState.Disabled;
break;
case "":
vmState = VMState.Paused;
break;
case "":
vmState = VMState.Suspended;
break;
case "":
vmState = VMState.Starting;
break;
case "":
vmState = VMState.Snapshotting;
break;
case "":
vmState = VMState.Saving;
break;
case "":
vmState = VMState.Stopping;
break;
case "":
vmState = VMState.Pausing;
break;
case "":
vmState = VMState.Resuming;
break;
}
return vmState;
}
private static string ConvertVMStateToStr(VMState vmState)
{
string status = string.Empty;
switch (vmState)
{
case VMState.Unknown:
status = "";
break;
case VMState.Enabled:
status = "";
break;
case VMState.Disabled:
status = "";
break;
case VMState.Paused:
status = "";
break;
case VMState.Suspended:
status = "";
break;
case VMState.Starting:
status = "";
break;
case VMState.Snapshotting:
status = "";
break;
case VMState.Saving:
status = "";
break;
case VMState.Stopping:
status = "";
break;
case VMState.Pausing:
status = "";
break;
case VMState.Resuming:
status = "";
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 虚拟机 管理的更多相关文章
- windows server 2008 r2 企业版 hyper v做虚拟化的相关问题处理
windows server 2008 r2 企业版 hyper v做虚拟化的相关问题处理 今天在dell r710 上用windows server 2008 r2企业版hyper v 做虚拟化,添 ...
- Hyper V NAT 网络设置 固定IP / DHCP
Hyper V 默认的Default Switch同时支持了NAT网络以及DHCP,虚拟机能够访问外网. 但使用过程中发现这个IP网段经常变化,而且Hyper V没有提供管理其NAT网络与DHCP的图 ...
- 设置Hyper V
1.打开服务器管理器 2.添加角色和功能 3.安装类型 -> 基于角色或基于功能的安装 4.服务器选择 -> 下一步 5.服务器角色 勾选"Hyper V"
- kvm虚拟机管理 系统自动化安装
原创博文安装配置KVM http://www.cnblogs.com/elvi/p/7718574.htmlweb管理kvm http://www.cnblogs.com/elvi/p/7718582 ...
- libvirt工具实现虚拟机管理
libvirt工具实现虚拟机管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.介绍virt-install命令的常用参数 virt-install是一个命令行工具,它能够为K ...
- [转载]【虚拟化系列】VMware vSphere 5.1 虚拟机管理
转载自:http://mabofeng.blog.51cto.com/2661587/1019497 在上一博文中我们安装了强大的VMware vCenter管理中心,通过VMware vSphere ...
- kvm虚拟机管理基础
部署 KVM 虚拟机 a.kvm 安装 环境:centos7,cpu 支持虚拟化,关闭 selinux,关闭 firewalld yum install libvirt virt-install qe ...
- HYPER -V 独立安装的 2016版本 中文版 下载好慢啊
HYPER -V 独立安装的 2016版本 中文版 下载好慢啊
- KVM -> 虚拟机管理&console登录_02
1.KVM虚拟机管理操作 virsh命令常用参数总结 1.开机关机: virsh list (只可以查看运行的虚拟机) virsh list --all (全部都可以查看) 开机与关机: virsh ...
随机推荐
- ExtJS4 表格的嵌套 rowExpander
今天做一个grid,里面的数据须要带明细,思来想去还是搞个表格嵌套吧!看下图 对于grid中每一条记录点击左边的+号能展开一个明细的子表格 全部数据包含列名均从后台获得,子表格的数据临时在本地以做測试 ...
- 如何ios中间Safari在开发了类似的native app像全屏webapp
本文交换了我www.gbtags.com文章. <meta name="format-detection" content="telephone=no email= ...
- 跨域 Iframe 通信解决方案(兼容 IE 系列浏览器。)
实现思路: 1.postMessage(IE8+, Firefox 3.1+, Opera 9+, Safari, and Chrome) 2.利用window.navigator共享信息,使支持IE ...
- 搞个这样的APP要多久? (转)
这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...
- matlab学习------------普通dialog对话框,错误对话框errordlg,警告对话框warndlg
Dialog对话框 语法: h = dialog('PropertyName',PropertyValue,...) 对话框的默认属性 WindowStyle的值: {normal} | moda ...
- secureCRT使用退格键(backspace)出现^H解决的方法
刚新装了python-3.4.1,使用secureCRT连接上去,可是我在进入后,输入回格键时,屏幕显示的是^H,这个让人受不了.最终在网上找到了解决的方法,仅仅要改动一下secureCRT的配置就可 ...
- DDD领域驱动设计仓储Repository
DDD领域驱动设计初探(二):仓储Repository(上) 前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repositor ...
- android CheckBox RadioButton 照片和文字的间距问题
利用自身的定义CheckBox 要么RadioButton时间.定义自己的图标和文字在不同的手机显示不同的音高.有时不太好控制,下面是我自己的定义CheckBox: 在Layout在下面xml: &l ...
- JSF+EJB+JPA总体思路
前言: JSF+EJB+JPA 其实我并没有想象中的难,只是想做好,建立在正确的地方应用,真正的困难. 良好的技术,在错误的地方做应用,这是唯一能够被垃圾. 用. 重量级企业应用能够使用这个主要的3层 ...
- Object-c中间initialize 与 辛格尔顿
简单说下initialize任务.在初始化过程中同样的类将被调用一次. 直接在代码解释initialize任务. 创建一个InitTest类 InitTest.m #import "Init ...