利用C#操作WMI指南

 更新时间:2016年11月30日 23:54:09   投稿:mdxy-dxy  
WMI提供了一套内置在Microsoft Windows操作系统中的丰富的系统管理服务,可以在有大量的应用程序、服务和设备的系统中提供全方位的管理功能。它允许应用程序的开发者,使用简单的、一致的机制,去查询企业中的任一台计算机上的信息,或是进行系统配置

1 什么是WMI?

Windows Management Instrumentation (WMI)是可伸缩的系统管理结构,该规范采用一个统一、基于标准且可扩展的面向对象接口。它提供与系统管理员信息和基础WMI API交互的标准方法,主要由系统管理应用程序开发人员和系统管理员用来访问和操作系统管理信息;它可用来生成组织和管理系统信息的工具,使系统管理人员能够更密切的监视系统活动。

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

通过WMI接口可以获得的信息量是惊人的,包括硬件设置,状态信息,驱动器配置,BIOS信息,应用程序的设置,事件记录信息,以及其他。WMI通过一组API来获得信息,但它表征的是一种通过一个简单,工业标准对象管理模式来获取信息的函数。这使得应用程序的开发者不必学习Windows的每一个API的具体细节。

.Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI提供了一个专门的命名空间"System.Management"。在命名空间"System.Management"中提供了大量用以处理和WMI相关的类、接口和枚举。在使用WMI之前,必须在工程中添加对System.Management.dll的引用,然后声明

using System.Management;

2 使用WMI连接远程计算机

系统管理员可以通过目标机器的机器名(或者IP地址),用户名以及密码去查询远程计算机的状态和信息,以及利用脚本执行一些管理工作。利用WMI连接远程计算机是很方便的,可以参考下面的格式

ManagementObjectSearcher query;   
ManagementObjectCollection queryCollection;
System.Management.ObjectQuery oq;

string machineName = "110.119.110.1"; //连接的目标机的IP地址或者机器名
co.Username = "YourName";         //连接需要的用户名
co.Password = "YourPassword";      //连接需要的密码
string connectString = "SELECT * FROM Win32_PnPSignedDriver";  //查询字符串

System.Management.ManagementScope ms = new System.Management.ManagementScope("\\\\" + machineName + "\\root\\cimv2", co); 
oq = new System.Management.ObjectQuery( connectString );
query = new ManagementObjectSearcher( ms, oq );
queryCollection = query.Get();

通过IP地址,用户名和密码就建立了一个可以查询Win32_PnPSignedDrvier这个类(关于这个类的详细信息请查询MSDN)所有信息的连接。现在我们就可以远程获取目标机器上的所有Pnp驱动的信息了。是不是很方便?在得到所有的信息后,我们可以通过下面的两种方式来获取我们需要的属性

foreach ( ManagementObject mo in queryCollection)
{
 // string hardwareID  = mo["HardwareID"]); //直接根据属性名得到属性的值
 
 //遍历所有属性,得到所有属性的值
 PropertyDataCollection searcherProperties = mo.Properties;
 foreach (PropertyData sp in searcherProperties)
 {
 Console.WriteLine("Name = {0, -20}, Value = {1, -20}", sp.Name,sp.Value);
 }
}

3 使用WMI连接本地计算机

使用WMI连接本地计算机也是非常方便的,我们只需要稍微修改一下上面的代码就可以了。

string machineName = "localhost";
co.Username = "";
co.Password = "";

也可以用比较简单的格式,直接使用查询语句。

string connectString = "SELECT * FROM Win32_PnPSignedDriver";

SelectQuery selectQuery = new SelectQuery( connectString );
ManagementObjectSearcher searcher = new ManagementObjectSearcher( selectQuery );

foreach (ManagementObject mo in searcher.Get())
{
 PropertyDataCollection searcherProperties = mo.Properties;
 foreach (PropertyData sp in searcherProperties)
 {
 Console.WriteLine(sp.Name + " " + sp.Value);
 }
}

4 查询语句的格式

上面的连接字符串connectString其实有很多种格式。对于WMI来说,使用WQL查询所需要的信息。WQL继承了SQL的一些语法。但是并不是说所有SQL的语句都可以用于WQL。常用的格式有如下几种。

(1)查询系统中类中所有对象的所有属性
connectString = "SELECT * FROM Win32_PnPSignedDriver"

(2)查询类中所有对象的HardwareID属性
connectString = "SELECT HardwareID FROM Win32_PnPSignedDriver"

(3)查询类中所有对象的HardwareID和DriverVersion属性
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver"

(4)查询类中所有对象的HardwareID和DriverVersion属性,并且对象的HardwareID必须以IBM254D结尾
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like '%IBM254D'"

(5)查询类中所有对象的HardwareID和DriverVersion属性,并且对象的HardwareID必须以Monitor开头
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor%'"

(6)查询类中所有对象的HardwareID和DriverVersion属性,并且对象的HardwareID必须是以Monitor开头,以IBM254D结尾,而且之间只有一个任意的字符
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D'"

(7)查询类中所有对象的HardwareID和DriverVersion属性,并且对象的HardwareID必须是以Monitor开头,以IBM254D结尾,而且之间只有一个任意的字符,还要满足InfName必须是oem18.inf
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D' AND InfName='oem18.inf'"

(8)查询类中所有对象的HardwareID和DriverVersion属性,并且对象的HardwareID必须是以Monitor开头,以IBM254D结尾,而且之间只有一个任意的字符,或者满足InfName是oem18.inf
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D' OR InfName='oem18.inf'"

5 参考资料和工具

WMI Reference:http://msdn2.microsoft.com/en-us/library/aa394572.aspx
WMI Tools:http://www.microsoft.com/downloads/details.aspx?familyid=6430f853-1120-48db-8cc5-f2abdc3ed314&displaylang=en
WQL Query:http://www.microsoft.com/china/technet/community/scriptcenter/topics/win2003/like.mspx#EIB

相关文章

  • C#实现身份证号码验证的方法

    C#实现身份证号码验证的方法

    这篇文章主要介绍了C#实现身份证号码验证的方法,通过封装的类文件实例化调用实现了对身份证号码的验证,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • C# 将数据库SqlServer数据绑定到类中的过程详解

    C# 将数据库SqlServer数据绑定到类中的过程详解

    本文讲述的是读取数据库中数据的常用做法,即将数据库中的数据绑定到创建的类中,再将类绑定到DataGridView的数据源中的做法,对C#将SqlServer数据绑定到类中感兴趣的朋友一起看看吧
    2022-06-06
  • WPF基于物理像素绘制图形

    WPF基于物理像素绘制图形

    这篇文章介绍了WPF基于物理像素绘制图形的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 探讨C#中Dispose方法与Close方法的区别详解

    探讨C#中Dispose方法与Close方法的区别详解

    本篇文章是对C#中Dispose方法与Close方法的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#中的矩形数组(多维数组)和锯齿数组的实现

    C#中的矩形数组(多维数组)和锯齿数组的实现

    本文主要介绍了C#中的矩形数组(多维数组)和锯齿数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 一个可携带附加消息的增强消息框MessageBoxEx

    一个可携带附加消息的增强消息框MessageBoxEx

    一个可携带附加消息的增强消息框MessageBoxEx分享给大家,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Unity实现简单换装系统

    Unity实现简单换装系统

    这篇文章主要为大家详细介绍了Unity实现简单换装系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • C#实现winform渐变效果的方法

    C#实现winform渐变效果的方法

    这篇文章主要介绍了C#实现winform渐变效果的方法,涉及到窗体的设计与属性的修改等技巧,需要的朋友可以参考下
    2014-10-10
  • C#多线程之线程同步WaitHandle

    C#多线程之线程同步WaitHandle

    这篇文章介绍了C#多线程之线程同步WaitHandle的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C# GUID ToString的使用总结

    C# GUID ToString的使用总结

    这篇文章主要介绍了C# GUID ToString的使用总结,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02

最新评论