WMI是Windows Management Instrumentation的简称,即“视窗管理规范”。早在Windows NT4.0时就已经开始支持WMI了,但WMI核心组件并没有随着NT4.0一起发布,如果要在NT4.0下支持WMI,就需要安装WMI的核心组件,你可以在VS.NET企业构建版中的第五张盘中的“WMI”目录中找到它。在NT4.0下安装WMI核心组件,必须保证NT 4.0版本为Service Pack 4.0或者更新的版本。如果您的机器使用的系统是Windows 2000或以后的版本,那么就没有这么麻烦了,因为WMI是默认安装的。
WMI的功能是十分强大的,通过WMI可以实现很多原来被认为很困难的工作,并且它也是.Net FrameWork SDK的很好的补充,尤其在现在,.Net FrameWork SDK功能还并不十分完备,有效的利用WMI的确可以简化很多本来很困难的问题。
利用WMI不仅可以解决本地机的很多问题,而且还可以用来编写网络应用程序,比如通过WMI获取远程计算机的各种数据信息、控制远程计算机的各种行为,而这就像操作本地机一样方便。而这只有一个前提条件,那就是必须知道远程计算机的超级用户和对应的口令。
一、简介C#中操作WMI使用的类库
.Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为C#能够操作WMI提供了一个专门的命名空间System.Management。在命名空间System.Management中提供了大量用以处理和WMI相关的类、接口和枚举。
命名空间System.Management中的成员是很复杂的,由于篇幅所限完全介绍这些成员是不可能的,也是没有要的。根据我的经验,认为要了解以及掌握在C#中使用WMI,下面六个类应该是学习的重点,分别是ConnectionOptions、ManagementScope、ObjectQuery、ManagementObjectSearcher、ManagementObject-Collection和ManagementObject。下面就简单介绍一下六个类。
1.ConnectionOptions类
ConnectionOptions类主要的功能是为建立的WMI连接提供所需的所有设置。在利用WMI对远程计算机进行操作的时候,首先要进行WMI连接,WMI连接主要是使用的是ManagementScope类,成功完成WMI连接就要提供远程计算机WMI用户名和口令。ConnectionOptions类可以通过其属性来提供这些信息。下表是ConnectionOptions类的一些主要属性及其简单的说明:
属性 | 说明 |
Authority | 获取或设置将用于验证指定用户的权利 |
Locale | 获取或设置将用于连接操作的区域设置 |
Password | 提供用于WMI连接操作的口令 |
Username | 提供用于WMI连接操作的用户名 |
2.ManagementScope类
通过ManagementScope类能够建立和远程计算机(或者本地计算机)的WMI连接,表示管理可操作范围。创建WMI连接可以通过二种方法:
(1)利用构造函数,当使用下面构造函数初始化ManagementScope类实例,同时也就建立了WMI连接,具体如下:
public ManagementScope(
string path ,
ConnectionOptions options
) ;
其中,参数path表示ManagementScope的服务器和命名空间,options包含有关连接的选项的ConnectionOptions。
使用构造函数是有风险的,因为如果不能根据提供的选项建立WMI连接,程序会抛出异常。下列代码是利用此构造函数构建建立ManagementScope实例,并建立于远程计算机majinhu的WMI连接:
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "WMI用户名";
Conn.Password = "此用户名对应口令";
System.Management.ManagementScope Ms = new ManagementScope("majinhu//root//cimv2", Conn) ;
(2)利用ManagementScope中提供的Connect方法。ManagementScope中的成员是非常少的,最常用的方法和属性各一个:常用属性是Options,主要为WMI建立提供参数;常用方法是Connect,通过它可以建立于远程计算机的WMI连接。下列是利用Connect方法建立WMI连接的具体代码:
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "WMI用户名";
Conn.Password = "此用户名对应口令";
System.Management.ManagementScope Ms = new ManagementScope("majinhu//root//cimv2" ) ;
Ms.Options = Conn;
Ms.Connect();
3.ObjectQuery类
ObjectQuery类或其派生类用于在Management ObjectSearcher中指定查询。程序中一般采用查询字符串来构造ObjectQuery实例。其中的查询字符串是一种类似SQL语言的WQL语言。下面的ObjectQuery类构造函数中最常见的一种,具体语法如下:
public ObjectQuery(string query);
其中,参数query代表查询的字符串。
4.ManagementObjectSearcher类
ManagementObjectSearcher主要是根据指定的查询检索WMI对象的集合。ManagementObjectSearcher组成成员也非常简单,其Get方法是非常重要的,Management ObjectSearcher通过Get方法进行WMI查询,并把得到的结果集合。Get方法的返回值是一个ManagementObjectCollection实例,它包含匹配指定查询的对象。下表是其Management ObjectSearcher类的常用属性及其说明:
属性 | 说明 |
Options | 有关如何搜索对象的选项 |
Query | 在搜索器中调用的查询 |
Scope | 在其中查找对象的范围 |
5.ManagementObjectCollection类
ManagementObjectCollection类非常简单,它主要表示 WMI 实例的不同集合其中包括命名空间、范围和查询观察程序等。创建ManagementObjectCollection类没有构造函数。
6.ManagementObject类
ManagementObject类为单个管理对象或类。通过ManagementObject中的方法可以调用ManagementObject对应的对象,从而执行相应的操作。ManagementObject类是一个内容丰富的类,下面是其常用属性和方法的列表:
属性或方法 | 说明 |
ClassPath | 对象的类的路径 |
Options | 检索对象时要使用的其他信息 |
Path | 对象的WMI路径 |
Scope | 此对象在其中驻留的范围 |
Clone | 创建对象的一个副本 |
CopyTo | 将对象复制到另一个位置 |
Delete | 删除对象 |
Get | 绑定到管理对象 |
GetRelated | 获取与该对象(联系对象)相关的对象的集合 |
GetRelationships | 获取该对象的关联的集合 |
InvokeMethod | 调用对应的对象方法 |
Put | 提交对对象所做的更改 |
二、WMI网络应用之一——获取远程计算机的信息
如果不使用WMI,想要获取远程计算机的系统数据,最常用的方法就是在远程计算机上运行一个客户端程序,本地机通过和这个客户端程序来获取远程计算机的系统数据。这种实现方法无论是程序设计还是后面的程序分发都是及其困难的。而使用WMI,一切就显得非常简单。下面介绍的这个示例,其功能是利用WMI获取远程计算机硬盘数据。各位只需对这个程序稍加修改,就可以获得远程计算机的其他数据。下面是具体的实现步骤:
1.首先启动Visual Studio .Net,依次选择“文件”、“新建”、“项目”菜单后,在弹出“新建项目”对话框中将“项目类型”设置为“Visual C#项目”,将“模板”设置为“Windows应用程序”,在“名称”文本框中输入“获得远程计算机硬盘信息”,在“位置”的文本框中输入“E:/VS.NET项目”,然后单击“确定”按钮,这样项目就建立好了。
2.由于Visual Studio .Net缺省的编译环境中并没有包括命名空间System.Management的容器文件System.Management.dll,所以首先要在项目文件中引入此DLL文件。首先选中“解决方案资源管理器”中的“引用”,然后单击鼠标右键,在弹出的菜单中,选择“添加引用”,在弹出的“添加引用”对话框中,选择“.Net”页面,在“组件名称”栏中选择“System.Managemen”后,单击“选择”按钮。此时在“选定的组件”栏中就加入了“System.Managemen”,然后单击“确定”按钮,现在Visual Studio .Net集成开发环境中就引入命名空间System.Managemen。
3.在“解决方案资源管理器”窗口中,双击Form1.cs文件,进入Form1.cs文件的编辑界面。
4.在Form1.cs文件的开头,在系统缺省的导入命名空间后面添加:
using System.Management;
用来引用WMI操作类位于的命名空间。
5.把Visual Studio .Net当前窗口切换到“Form1.cs(设计)”窗口,设计窗体。
6.按照下表调整各组件属性对应的值:
组件类型 | 组件名称 | 属性 | 设置结果 |
Form | Form1 | Text | 获取远程计算机硬盘信息 |
|
| FormBorderStyle | FixedSingle |
|
| MaximizeBox | False |
TextBox | textBox3 | PasswordChar | * |
Button | button1 | FlatStyle | Flat |
7.把Visual Studio .Net的当前窗口切换到Form1.cs文件的编辑窗口,并用下列代码替换Form1.cs中的button1的Click事件对应的处理代码。下列代码的作用是对远程计算机进行WMI查询,提取查询得到数据并显示结果:
private void button1_Click(object sender, System.EventArgs e)
{
long mb = 1048576; //1024x1024
//设定生成的WMI所需的所有设置
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = textBox2.Text; //用户名
Conn.Password = textBox3.Text; //口令
//设定用于执行WMI操作的范围
System.Management.ManagementScope Ms = new ManagementScope( "" + textBox1.Text + "//root//cimv2", Conn);
try
{
//连接到实际操作的WMI范围
Ms.Connect();
//设定通过WMI要查询的内容
ObjectQuery Query = new ObjectQuery("select FreeSpace ,Size ,Name from Win32_LogicalDisk where DriveType=3");
//WQL语句,设定的WMI查询内容和WMI的操作范围,检索WMI对象集合
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Ms, Query);
//异步调用WMI查询
ManagementObjectCollection ReturnCollection = Searcher.Get();
double free = 0;
double use = 0;
double total = 0;
listBox1.Items.Clear();
//通过对产生的WMI的实例集合进行检索,获得硬盘信息
foreach (ManagementObject Return in ReturnCollection)
{
listBox1.Items.Add("磁盘名称:" + Return["Name"].ToString());
free = Convert.ToInt64(Return["FreeSpace"]) / mb; //获得硬盘的可用空间
use = (Convert.ToInt64(Return["Size"]) - Convert.ToInt64(Return["FreeSpace"])) / mb;//获得硬盘的已用空间
//获得硬盘的合计空间
total = Convert.ToInt64( Return["Size"]) / mb;
listBox1.Items.Add( " 总计:" + total.ToString() + "MB");
listBox1.Items.Add( "已用空间:" + use.ToString() + "MB");
listBox1.Items.Add( "可用空间:" + free.ToString() + "MB");
}
}
catch(Exception ee)
{
MessageBox.Show("连接" + textBox1.Text + "出错,出错信息为:" + ee.Message, "出现错误!");
}
}
8.按下快捷键F5运行程序。在正确输入远程计算机的IP地址或用户名、超级用户名和口令后,单击“获取硬盘信息”按钮,程序便会获取的指定计算机的硬盘的数据并显示出来。
怎么样,是否有一种做黑客的感觉?下面将介绍使用WMI完成一个更“酷”的程序——重启或关闭远程计算机!
三、WMI网络应用之二——控制远程计算机
WMI不仅可以获取想要的计算机数据,而且还可以用以远程控制。远程控制计算机不仅是黑客们的梦想,也是大多数网络管理者所渴望得到的,尤其在现代的网络中,每一个网络管理者所面对的局域网,都是由一个庞大的计算机群组成,如果有效的管理网络的每一台计算机就显得格外重要了。目前网络管理软件通常的做法是在远程计算机上运行客户端程序,在本地计算机上运行一个控制程序,通过这二个程序直接的通讯实现对计算机的远程控制。这种作法的缺点是十分明显的,当客户端关闭了后台程序,这种远程管理就无法实现了。
其实做远程控制软件,WMI是一个很好的选择,尤其是在Windows 2000、XP已经成为了主流的操作系统,利用WMI编写远程控制软件可以省略了已往远程控制软件最头痛的一个环节——分发客户端程序。
本节中介绍的远程控制程序,能够让使用者重启和关闭远程计算机。下面是C#中利用WMI控制远程计算机具体实现步骤:
1.首先启动Visual Studio .Net,依次选择“文件”、“新建”、“项目”菜单后,在弹出“新建项目”对话框中将“项目类型”设置为“Visual C#项目”,将“模板”设置为“Windows应用程序”,在“名称”文本框中输入“利用WMI控制远程计算机”,在“位置”的文本框中输入“E:/VS.NET项目”,然后单击“确定”按钮,这样项目便建立好了。
2.重复“获取远程计算机硬盘信息”项目中的第2至第4步。
3.把Visual Studio .Net当前窗口切换到“Form1.cs(设计)”窗口,按照图3进行窗体设计:
4.按照下表的数据调整各组件属性对应的数值:
组件类型 | 组件名称 | 属性 | 设置结果 |
Form | Form1 | Text | 利用WMI控制远程计算机 |
|
| FormBorderStyle | FixedSingle |
|
| MaximizeBox | False |
TextBox | textBox3 | PasswordChar | * |
Button | button1 | FlatStyle | Flat |
ComboBox | comboBox1 | Items | 重新启动 |
5.把Visual Studio .Net的当前窗口切换到Form1.cs文件的编辑窗口,并用下列代码替换Form1.cs中的button1的Click事件对应的处理代码。下列代码的作用是对根据用户的选择对远程计算机进行进行相应的远程控制:
private void button1_Click(object sender, System.EventArgs e)
{
//确定WMI操作的范围
ConnectionOptions options = new ConnectionOptions();
options.Username = textBox2.Text; //用户名
options.Password = textBox3.Text; //用户口令
try
{
ManagementScope Conn = new ManagementScope("" + textBox1.Text + "//root//cimv2", options);
Conn.Connect();
//确定WMI操作的内容
ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher query1 = new ManagementObjectSearcher(Conn, oq);
//获取WMI操作内容
ManagementObjectCollection queryCollection1 = query1.Get();
//根据使用者选择执行相应的远程操作
foreach (ManagementObject mo in queryCollection1)
{
string [ ] ss= { "" };
if (comboBox1.Text == "重新启动")
mo.InvokeMethod("Reboot", ss); //执行重启操作
else if (comboBox1.Text == "远程关机")
mo.InvokeMethod("Shutdown", ss); //执行远程关机
else
MessageBox.Show("选择不正确的操作!", "错误!");
}
}
catch(Exception ee)
{
MessageBox.Show("连接" + textBox1.Text + "出错,出错信息为:" + ee.Message ); //报错
}
}
6.按下F5快捷键,就可以运行程序了。在程序的“计算机名称或IP地址”文本框中输入要控制的远程计算机名称或IP地址,在“具有WMI权限的用户名”和“口令”文本框中输入具有WMI操作的帐户和口令,在“选择控制类型”组合框中选择对远程计算机的控制类型后,单击“执行”按钮,则程序就能够对指定的远程计算机进行相应的控制了。
四、总结
通过以上两个示例,可见WMI的确是一个非常有用的东西,但由于它还比较新,国内甚至国外还没有完整的介绍资料,上述内容只是带诸位简要的浏览了一下WMI,其实通过WMI完成很多功能还需要不断的探索,希望本章的内容能够对大家了解、掌握WMI的使用方法有所帮助。
源程序下载地址:http://www.cfan.com.cn/qikan/cfan/source/0308csh.zip。