WMI是Windows Management Instrumentation的简称,即:视窗管理规范。在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件。通过WMI可以获取远程计算机的各种数据信息,控制远程计算机的各种行为,而这就像操作本地机一样方便、简单。
WMI从根本上说应该为一种服务,WMI服务在组件服务中的显示名称为"Windows Management Instrumentation"。对于本地不同的用户,WMI所有的权限也不一样。
.Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI提供了一个专门的命名空间"System.Management"。在命名空间"System.Management"中提供了大量用以处理和WMI相关的类、接口和枚举。
在实际编程中需要注意,System.Management 命名空间中的类都存在于System.Management .dll这个文件中,所以在编程的时候一定要添加对这个dll文件的引用,然后还需要在我们的程序开始处添加如下代码:using System.Management
技术范围 | Classes/interfaces/configuration elements |
---|---|
收集 WMI 类信息 | |
查询数据 异步查询数据 | SelectQuery, ManagementObjectSearcher, WqlObjectQuery, ObjectQuery |
执行方法 异步执行方法 | ManagementOperationObserver |
接收事件 异步接收事件 | WqlEventQuery, ManagementEventWatcher EventArrivedEventArgs, EventArrivedEventHandler, CompletedEventArgs, CompletedEventHandler |
连接到远程计算机 |
此外还有一个 System.Management.Instrumentation 子命名空间,相关介绍请参考MSDN
有三个工具,使用它们有助于对WMI开发的学习
1、系统自带的wbemtest.exe
2、微软提供的 agement (WMI) Extensions for Visual Studio .NET 2003 Server Explore
3、微软提供的 WMI Code Creator WMI代码生成器
这里推荐第三个工具,此外在参考MSDN或使用工具时要注意一点,有些方法的调用可能是与平台相关的,如Win32_NetworkAdapter中的几个方法Disable、Enable、Reset在XP中会提示”在类中找不到这个方法”
WMI开发是一个较庞大的知识体系,利用WMI可以完成大致三类操作:
1、数据收集,如CPU、网卡硬件信息
2、执行方法,如设置网卡IP
3、接收事件,如当某个服务启动或停止时应用程序得到通知
.net中与WMI相关的主要类介绍:
1、连接
可使用ConnectOptions和ManagementScope类带上连接帐号及密码连接远程计算,本地计算机可略过此步骤
ManagemenScope也不允许带用户名密码方式的本地计算机连接,这会引发一个异常,此外在连接远程计算机时有一些条件需要具备,比如RPC服务可用、本地策略中登录模式为经典模式。相关知识可参考网上“WMI入侵”一文,可使用Recton作一下连接测试,它同样是利用了WMI
2、数据收集
在WMI中提供了两种数据收集方式,一是使用ManagementClass,另一种方式是在ManagementObjectSearch类中使用WQL查询语句
注意,对象的属性,它可能是一个变量,也可能是一个数组地址
3、方法调用
ManagementBaseObject提供了InvokeMethod方法进行对象的方法调用,对于有参数的对象方法,需要使用GetMethodParameters方法获取该对象方法的参数,并设置,然后在InvokeMethod调用中传入
4、事件通知
事件通知的大致步骤是利用WQL语句写明需要过滤什么事件,建立一个WqlQueryEvent,然后把WqlQueryEvent对象传递给ManagementEventWatcher类的构造,接着进行同部或异步操作等待事件触发通知
同步示例
参考资料:
WMI .NET 概述
http://msdn.microsoft.com/zh-cn/library/ms257340(VS.80).aspx
Windows Management Instrumentation (Windows)
http://msdn.microsoft.com/en-us/library/aa394582(VS.85).aspx
WMI Series 1-8
http://www.google.cn/search?hl=zh-CN&newwindow=1&q=site%3Adev.youkuaiyun.com+WMI+Series
.net中的WMI编程(一):WMI介绍及简单应用
http://blog.youkuaiyun.com/zhoufoxcn/archive/2008/01/14/2042697.aspx
.net中的WMI编程(二):WMI中的WQL语言和WQL的测试工具
http://blog.youkuaiyun.com/zhoufoxcn/archive/2008/01/14/2044246.aspx
WMI使用小工具——WMI代码生成器
http://blog.youkuaiyun.com/zhoufoxcn/archive/2009/06/16/4272209.aspx
Visual C#中用WMI编写网络程序
http://www.anqn.com/dev/vc/2009-06-20/a09111805-1.shtml
WMI 远程连接问题解决方法
http://dragon0704.spaces.live.com/blog/cns!732dddd1803acb26!342.entry
利用WMI打造完美“三无”后门
http://huaidan.org/archives/2265.html
WMI使用说明
http://blog.youkuaiyun.com/stbrine/archive/2006/08/19/1096894.aspx
WMI初探随记
http://www.nukeblog.cn/article/pw/15.htm
WMI使用技巧集 C#
http://www.cnblogs.com/mopems/articles/74921.html
利用 WMI 修改计算机的网络设置
http://dev.youkuaiyun.com/article/21/21398.shtm
利WMI实现监视局域网计算机CPU使用情况
http://www.cnblogs.com/henryfan/archive/2006/09/14/503811.html