WMI在网络编程中的应用

来源:互联网 发布:base64编码算法 java 编辑:程序博客网 时间:2024/05/05 05:19

WMI在网络编程中的应用

WMIWindows 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 SDKWMI提供了全面的支持,.Net FrameWork SDKC#能够操作WMI提供了一个专门的命名空间System.Management。在命名空间System.Management中提供了大量用以处理和WMI相关的类、接口和枚举。
  命名空间System.Management中的成员是很复杂的,由于篇幅所限完全介绍这些成员是不可能的,也是没有要的。根据我的经验,认为要了解以及掌握在C#中使用WMI,下面六个类应该是学习的重点,分别是ConnectionOptionsManagementScopeObjectQueryManagementObjectSearcherManagementObject-CollectionManagementObject。下面就简单介绍一下六个类。
  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实例,并建立于远程计算机majinhuWMI连接:
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中的button1Click事件对应的处理代码。下列代码的作用是对远程计算机进行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 2000XP已经成为了主流的操作系统,利用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中的button1Click事件对应的处理代码。下列代码的作用是对根据用户的选择对远程计算机进行进行相应的远程控制:
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