Visual C#中操作WMI的类库简介

.Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI提供了一个专门的命名空间"System.Management"。在命名空间"System.Management"中提供了大量用以处理和WMI相关的类、接口和枚举。

  命名空间"System.Management"中的成员是非常复杂的,由于篇幅所限完全介绍这些成员是不可能的,也是没有要的。根据我的经验,认为要了解、掌握在Visual C#中使用WMI,下面六个类应该是学习的重点,分别是ConnectionOptions、ManagementScope、ObjectQuery、ManagementObjectSearcher、ManagementObjectCollection和ManagementObject。下面就简单介绍一下六个类:

  ·ConnectionOptions类

  ConnectionOptions类主要的功能是为建立的WMI连接提供所需的所有设置。在利用WMI对远程计算机进行操作的时候,首先要进行WMI连接,WMI连接主要是使用的是ManagementScope 类,成功完成WMI连接就要提供远程计算机WMI用户名和口令。ConnectionOptions类可以通过其属性来提供这些信息。表01是ConnectionOptions类的一些主要属性及其简单的说明。

属性 说明
Authority 获取或设置将用于验证指定用户的权利。
Locale 获取或设置将用于连接操作的区域设置。
Password 提供用于WMI连接操作的口令。
Username提供用于WMI连接操作的用户名。

     表01:ConnectionOptions类常用属性及其说明

  其中最常用的属性是Password和Username。

  ·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 ( ) ;
//设定用于WMI连接操作的用户名
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 ( ) ;
//设定用于WMI连接操作的用户名
Conn.Username = "WMI用户名";
//设定用户的口令
Conn.Password = "此用户名对应口令";
System.Management.ManagementScope Ms = new ManagementScope("//majinhu/root/cimv2" ) ;
Ms.Options = Conn ;
Ms.Connect ( ) ;
//建立WMI连接


  ·ObjectQuery类

  ObjectQuery类或其派生类用于在ManagementObjectSearcher中指定查询。程序中一般采用查询字符串来构造ObjectQuery实例。其中的查询字符串是一种类似SQL语言的WQL语言。下面的ObjectQuery类构造函数中最常见的一种,具体语法如下:

public ObjectQuery (
string query
) ;


  参数:

  query 查询的字符串

  ·ManagementObjectSearcher类

  ManagementObjectSearcher主要是根据指定的查询检索WMI对象的集合。ManagementObjectSearcher组成成员也非常简单,其方法Get方法是非常重要的,ManagementObjectSearcher通过Get方法进行WMI查询,并把得到的结果集合。Get方法的返回值是一个ManagementObjectCollection实例,它包含匹配指定查询的对象。

  表02是其ManagementObjectSearcher类的常用属性及其说明。

属性 说明
Options 有关如何搜索对象的选项
Query 在搜索器中调用的查询
Scope 在其中查找对象的范围

      表02:ManagementObjectSearcher类常用属性及其说明

  ·ManagementObjectCollection类

  ManagementObjectCollection类非常简单,它主要表示 WMI 实例的不同集合其中包括命名空间、范围和查询观察程序等。创建ManagementObjectCollection类没有构造函数。

  ·ManagementObject类

  ManagementObject类为单个管理对象或类。通过ManagementObject中的方法可以调用ManagementObject对应的对象,从而执行相应的操作。ManagementObject类是一个内容丰富的类,表03和表04分别是其常用的属性和方法。

属性 说明
ClassPath 对象的类的路径。
Options 检索对象时要使用的其他信息。
Path 对象的 WMI 路径。
Scope 此对象在其中驻留的范围。

       表03:ManagementObject类常用属性及其说明

方法说明
Clone创建对象的一个副本。
CopyTo将对象复制到另一个位置。
Delete 删除对象。
Get 绑定到管理对象。
GetRelated 获取与该对象(联系对象)相关的对象的集合。
GetRelationships获取该对象的关联的集合。
InvokeMethod 调用对应的对象方法。
Put 提交对对象所做的更改。

      表04:ManagementObject类常用方法及其说明

  下面就结合二个具体的示例来介绍Visual C#中利用上述类,提供WMI掌握如何利用WMI编写网络应用程序,所使用的类库主要是使用了上面接收的这六个类。

 

二、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.按照下表调整各组件属性对应的值:

组件类型组件名称属性设置结果
FormForm1Text获取远程计算机硬盘信息
  FormBorderStyleFixedSingle
  MaximizeBoxFalse
TextBoxtextBox3PasswordChar*
Buttonbutton1FlatStyleFlat

  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.按照下表的数据调整各组件属性对应的数值:
组件类型组件名称属性设置结果
FormForm1Text利用WMI控制远程计算机
  FormBorderStyleFixedSingle
  MaximizeBoxFalse
TextBoxtextBox3PasswordChar*
Buttonbutton1FlatStyleFlat
ComboBoxcomboBox1Items重新启动
远程关机
  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的使用方法有所帮助。

 

实例

WMI 对大多数开发人员来说是一个感觉比较迷惑的东西,对我来说也是如此。直到最近看了一篇关于 .Net Management 的介绍后,才对WMI 有了一点点了解。下面就把自己的一点经验写给爱好C# 的朋友们。

WMI 是一个非常强大的工具,它可以提供给我们非常强大的功能。比如在我们开发应用程序时经常需要得到本地或远程操作系统的信息。虽然看起来很平常,但是实际操作起来还是比较麻烦的,尤其当我们想要获得远程操作系统的信息时。WMI 要求开发者使用WQL 方式来访问对方。WQL 允许我们像使用SQL-LINK查询语言一样使用它。只要你知道这些类和它的字段变量,你可以很容易的得到你想要的信息。使用 WMI,使用者可以用查询精确地定义数据流。通过仅指定那些感兴趣的属性(在 SELECT 语句中)和仅检索感兴趣的实体(使用 WHERE 子句)这两项措施,查询限制了返回的数据量。例如,如果用户要检索计算机上所有小于 2 MB 的驱动器(驱动器 C、D 等):

SELECT * FROM Win32_LogicalDisk WHERE FreeSpace < 2000000

正如你看到的那样,使用一个简单的WMI 查询是相当容易的。为了实现这个结果,你需要在.NET 中引用System.Management 命名空间。只要你懂得一点数据库知识,我们就可以利用它操作所有我们的查询。

    System.Management 命名空间是 .NET 框架中的 WMI 命名空间。此命名空间包括下列类对象:

ManagementObject 或 ManagementClass:分别为单个管理对象或类。

ManagementObjectSearcher:用于根据指定的查询或枚举检索 ManagementObject 或 ManagementClass 对象的集合。

ManagementEventWatcher:用于预订来自 WMI 的事件通知。

ManagementQuery:用作所有查询类的基础。

下列代码向您展示了如何使用 WMI 列举远程机器上所有开启的进程。

private void RemoteEnumerate_Click(object sender, System.EventArgs e)

{

//如果是对远程机器进行访问,必须要进行连接,本地可以省略

ConnectionOptions oConn = new ConnectionOptions();

//用户名和口令是你登陆对方是必须输入的,也就是对方给你分配的权限
oConn.Username = "ZhangDong"; //访问对方的用户名
oConn.Password = "1234"; //访问对方的口令

// ServerName 是对方机器的名字,也可以是 IP 地址,//root//cimv2 照抄就行
ManagementPath p = new ManagementPath("ServerName//root//cimv2");  

ManagementScope ms = new ManagementScope(p,oConn);

ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_Process");

ManagementObjectSearcher query1 = new ManagementObjectSearcher(ms,oq);

ManagementObjectCollection queryCollection1 = query1.Get();           

//列举所有对像,并显示在 listBox 中

       foreach (ManagementObject service in queryCollection1)

      {

         // 列表框中显示的是进程的名称和所在路径,当然还有其它信息,比如进程句柄、//进程优先级、现在的运行状态等,我们没有全部列举出来,感兴趣的话您可以自//己试试

        listBox1.Items.Add("Service: " + service["Name"] + " FilePath: " + service["ExecutablePath"]);

}
 }

正像你看到的那样,实现起来并不很难,可以说相当容易。

WMI 方法调用  
WMI 另一个比较有趣的方面是远程方法调用。当然方法是存在于每个 WMI 类中的,WMI

类有自己的方法,而有的 WMI 类没有方法。下面我们来看一看,另外一个WMI 类。     Win32_Share 类,此 WMI 类共有三个方法它们是:Create,Delete,SetShareInfo我们只讲讲其中的一个Create方法,其余两个和其它 WMI 类的方法调用方式是一样的。

其中 Create 方法说明如下:

int Create

(     String SharePath; //共享路径,你要把那个路径共享

String ShareName; //共享后,访问时的标示名称

Int    ShareType; //共享类型,一般赋 0 即可,表示磁盘共享

Int    MaxUsers; //最大用户数

String Description; //描述

String PassWord; //访问密码

返回 0 表示成功创建共享。下面的程序创建共享后,只有点击右键后查看共享才能看见此文件夹已经共享,不然是看不出来的。就形如 C$ 形式,系统级共享。

private void RemoteShare_Click(object sender, System.EventArgs e)

{   //连接远程计算机,我们要想对其进行操作,必须先连接上

    ConnectionOptions Myconnect = new ConnectionOptions();

    Myconnect.Username = "ZhangDong";

    Myconnect.Password = "1234";

  ManagementPath RemoteNameSpace = new ManagementPath("ServerName//root//cimv2");  

ManagementScope Myscope = new ManagementScope(RemoteNameSpace,Myconnect);

    //先连接上要引用的 WMI 类在这里我们引用 Win32_Share 类

ManagementPath SharePath = new ManagementPath("Win32_Share");

ObjectGetOptions otherOption =  new ObjectGetOptions(null,new

TimeSpan(0,0,10) ,true);

ManagementClass _processClass = new ManagementClass(Myscope, SharePath,

otherOption);

object[] sharea = {"C://Program Files","我的共享",0,10,"Dot Net 实现的共享",""};

object result = _processClass.InvokeMethod ("Create", sharea);

MessageBox(0,"返回的值是:" + result.ToString() + " 共享名称:" + sharea[1],"共享信息",0); }

针对上面的程序我们需要注意的一点就是,参数的传递形式,我们采用的是下面这种形式

 object[] sharea = {"C://Program Files","我的共享",0,10,"Dot Net 实现的共享",""};

这个数组代表的是方法中传递的参数, WMI 类中其它的方法调用都可以参照着这种形式.

比如前面我们讲的,列举所有开启的进程时,如果我们想远程关闭某个开启的进程,我们需要用下面的代码来实现:

foreach (ManagementObject service in queryCollection1)

    {  //判断是否开启了delphi 程序,如果是,关闭它

if (service["Name"].ToString()=="delphi32.exe")

        {

            string[] Tparas = {"0"}; //参数数组

            service.InvokeMethod("Terminate", Tparas); //终止方法的调用

        }  

        //列举所有进程的名字,和此应用程序的路径,当然还有其它一些属性,只不过这//里没有列举出来

listBox1.Items.Add("Service: " + service["Name"] + " FilePath: " + service["ExecutablePath"]);

}

总结:

关于 WMI 还有许多其它的功能,我希望通过本文大家能够对 .NET 中的Windows 管理有所了解。同时也希望爱好 C# 的朋友们互相多多交流经验

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈火蜓蜻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值