`
kcb026ya
  • 浏览: 13822 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

阅读更多

Visual C#中操作WMI的类库简介
2010年06月28日
  .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连接,具体如下:  参数:
  path ManagementScope的服务器和命名空间。 
  options 包含有关连接的选项的 ConnectionOptions。
  使用构造函数是有风险的,因为如果不能根据提供的选项建立WMI连接,程序会程序异常,出现错误。 
  下列代码是利用此构造函数构建建立ManagementScope实例,并建立于远程计算机majinhu的WMI连接:  ( 2 ) . 利用ManagementScope中提供的Connect方法:
  ManagementScope中的成员是非常少的,最常用的方法和属性各一个:常用属性是Options,主要为WMI建立提供参数;常用方法是Connect,通过它可以建立于远程计算机的WMI连接。下列是利用Connect方法建立WMI连接的具体代码:  .ObjectQuery类
  ObjectQuery类或其派生类用于在ManagementObjectSearcher中指定查询。程序中一般采用查询字符串来构造ObjectQuery实例。其中的查询字符串是一种类似SQL语言的WQL语言。下面的ObjectQuery类构造函数中最常见的一种,具体语法如下:  参数:
  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.按照下表调整各组件属性对应的值:
  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的使用方法有所帮助。
  实例 WMI 对大多数开发人员来说是一个感觉比较迷惑的东西,对我来说也是如此。直到最近看了一篇关于 .Net Management 的介绍后,才对WMI 有了一点点了解。下面就把自己的一点经验写给爱好C# 的朋友们。
  WMI 是一个非常强大的工具,它可以提供给我们非常强大的功能。比如在我们开发应用程序时经常需要得到本地或远程操作系统的信息。虽然看起来很平常,但是实际操作起来还是比较麻烦的,尤其当我们想要获得远程操作系统的信息时。WMI 要求开发者使用WQL 方式来访问对方。WQL 允许我们像使用SQL-LINK查询语言一样使用它。只要你知道这些类和它的字段变量,你可以很容易的得到你想要的信息。使用 WMI,使用者可以用查询精确地定义数据流。通过仅指定那些感兴趣的属性(在 SELECT 语句中)和仅检索感兴趣的实体(使用 WHERE 子句)这两项措施,查询限制了返回的数据量。例如,如果用户要检索计算机上所有小于 2 MB 的驱动器(驱动器 C、D 等):
  SELECT * FROM Win32_LogicalDisk WHERE FreeSpace Windows 管理有所了解。同时也希望爱好 C# 的朋友们互相多多交流经验
分享到:
评论

相关推荐

    WMI 类库查看器

    WMI类库查看器,所有WMI class的信息。可以查看任意机器硬件的所有详细信息。 只有452KB大小,绿色,下载下来只有一个exe文件,双击就可以使用

    Visual Basic编程访问WMI对象

    Visual Basic编程访问WMI对象帮你了解windows的wmi如何利用

    Delphi 操作wmi的类库

    摘要:Delphi源码,控件组件,wmi类库 delphi 操作 wmi 类库,里面是两个类文件,没有示例程序,有不少朋友反馈说找不到这个类库,于是从以前收集的程序中找到这个WMI类,分享给大家。

    C#操作WMI完美demo

    利用WMI技术获取系统相关信息: 1.硬件配置 2.设备驱动 3.环境变量 4.内存信息 5.网卡信息 6.处理器信息 7.进程信息 8.显卡信息 并能查询WMI各类数据

    Visual C++源代码 82 如何使用WMI条件查询系统服务

    Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源代码 82 如何使用WMI条件查询系统服务Visual C++源...

    WMI.rar_C# WMI_WMI WIN32_process.z_windows wmi_wmi

    WMI 的一个实现.zip,用C#语言实现,是学习WMI的好例子

    c#使用wmi查询usb设备信息示例

    开发环境:Visual Studio V2010 .NET Framework 4 Client Profile 代码如下:using System;using System.Management;using System.Text.RegularExpressions;using System.Collections.Generic; namespace Splash.IO....

    C# WMI 编程技术介绍

    C#利用WMI技术可以远程重启,关闭主机,也可以远程操作主机。

    c#使用WMI更改IP地址

    c#使用WMI更改IP地址注释写的非常清楚,示例简单,可用性高

    wmi.rar_C# WMI_windows wmi_wmi_wmi proerties

    WINdows wmi编程 C#实例 里面很清楚的介绍了好几个常见的WMI的查询

    Visual C++源代码 87 如何使用WMI查询处理器信息

    Visual C++源代码 87 如何使用WMI查询处理器信息Visual C++源代码 87 如何使用WMI查询处理器信息Visual C++源代码 87 如何使用WMI查询处理器信息Visual C++源代码 87 如何使用WMI查询处理器信息Visual C++源代码 87 ...

    C#实例 实现WMI连接目标,运行命令与获取计算机信息并能打开对方SMB同时实现连接并完成文件传输一整套解决方案 附Log4Net日志

    C#实例 实现WMI连接目标,运行命令与查询状态并能打开对方SMB同时实现连接并完成文件传输一整套解决方案 附Log4Net日志 此实例完整演示了如何连接135RPC服务,即WMI服务,实现功能: 1、远程获取计算机信息 2、执行...

    C#、wmi 远程监控进程内存

    近期公司要让写个远程监控进程的内存和cpu百分比,自己写了个程序,主要功能就是监控多台机器指定进程的cpu占比和内存消耗

    Visual C# 2005编程实例精粹 源码

    在本书中,还介绍了托管状态下的Office自动化技术、WMI管理规范应用、XML文件读写、系统API函数调用、注册表个性化设置、文件压缩和解压缩、智能客户端部署、异常捕获、异步调用、ToolStrip系统控件应用、WebPart...

    Visual C++源代码 84 如何使用WMI查询声音设备信息

    Visual C++源代码 84 如何使用WMI查询声音设备信息Visual C++源代码 84 如何使用WMI查询声音设备信息Visual C++源代码 84 如何使用WMI查询声音设备信息Visual C++源代码 84 如何使用WMI查询声音设备信息Visual C++源...

    C# 调用WMI 获取系统信息

    如何获取硬件信息(CPU ID,主板信息,硬盘序列,系统信息 ,内存信息,BIOS信息等),非常全,所有WMI Class 都包

    Visual C++源代码 86 如何使用WMI查询串行端口信息

    Visual C++源代码 86 如何使用WMI查询串行端口信息Visual C++源代码 86 如何使用WMI查询串行端口信息Visual C++源代码 86 如何使用WMI查询串行端口信息Visual C++源代码 86 如何使用WMI查询串行端口信息Visual C++源...

    Visual C# 2005编程技巧大全 源码

    全书内容涵盖了大量的Visual C# 2005 编程新技术和新理念,包括ToolStrip控件应用、泛型应用、注册表管理、WMI管理规范使用、XML文件处理、多线程处理、程序异常处理、文件压缩及解压缩、文件加密解密、文件访问权限...

    利用C#操作WMI指南

    WMI提供了一套内置在Microsoft Windows操作系统中的丰富的系统管理服务,可以在有大量的应用程序、服务和设备的系统中提供全方位的管理功能。它允许应用程序的开发者,使用简单的、一致的机制,去查询企业中的任

    c#利用wmi配置ip

    本资源包含了 如何使用c#调用wmi函数 并利用wmi中win32类Win32_NetworkAdapterConfiguration配置静态ip

Global site tag (gtag.js) - Google Analytics