利用C#操作WMI指南
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:
wmi tools:
wql query:http://www.microsoft.com/china/technet/community/scriptcenter/topics/win2003/like.mspx#eib
上一篇: C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)
下一篇: 车联网时代,加油也无需去加油站