本帖最后由 batman 于 2013-9-3 08:52 编辑
- 很多人在平常会有事件监控的需要,如监控进程的运行、监视移动磁盘的插入、监视文件系统的操作等等。今天,我就向大家强力推介一件强大的事件监控“神器”--WMI。WMI是英文Windows Management Instrumentation的缩写,意思就是WINDOWS管理规范,我们可以通过WMI方便地实现对本地或远程计算机的管理。
-
- 那么WMI是如何实现事件监控功能的,原来WMI能访问WINDOWS下的API组件,并能接收其运行时实时的INSTANCECREATIONEVENT(创建或启动事件)、INSTANCEDELETIONGEVENT(删除或关闭事件)、INSTANCEMOTIFICATIONEVENT(修改或变更事件)、INSTANCEOPRATIONEVENT(所有事件)的返回状态,从而判断事件的性质,而实现对事件的监控。
-
- 下面我们结合一段实时监控U盘状态的代码来进行详细说明:
复制代码
- On Error Resume Next
- Dim objWMI, objSHELL, objEvents, objEvent
- Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
- Set objSHELL = CreateObject("Wscript.Shell")
- Set objEvents = objWMI.ExecNotificationQuery _
- ("Select * From __InstanceOperationEvent Within 5 " _
- & "Where TargetInstance Isa 'Win32_LogicalDisk' " _
- & "And TargetInstance.DriveType = 2")
- Do While True
- Set objEvent = objEvents.NextEvent()
- Select Case objEvent.Path_.Class
- Case "__InstanceCreationEvent"
- objSHELL.Popup "检测到盘符号为" & objEvent.TargetInstance.Name & "的U盘插入",3,"系统提示"
- Case "__InstanceDeletionEvent"
- objSHELL.Popup "盘符号为" & objEvent.TargetInstance.Name & "的U盘被移除",3,"系统提示"
- End Select
- Loop
复制代码
- 第一眼看到这段代码,我相信很多人会有点晕。确实这个U盘事件监控的代码,看起来是比较复杂而难以理解的。但只要我们抓住了其中的几个要点就能理出清晰的思路来:
-
- 首先,我们知道Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")是定义WMI名称空间,以便让WMI能访问后面的Win32_LogicalDisk API组件,大家记住这是一个较标准的书写好了。
-
- 接下来我们通过一段非常复杂的代码来定义要监控的事件:Set objEvents = objWMI.ExecNotificationQuery("Select * From __InstanceOperationEvent Within 5 TargetInstance Isa 'Win32_LogicalDisk' And TargetInstance.DriveType = 2")。其中ExecNotificationQuery是告诉WMI执行监控查询方式,后面的括号中所有的内容即为这个查询的内容和条件:每隔5秒(Within 5)查询一次所有的事件实例(InstanceOperationEvent),并从中筛选出属于Win32_LogicalDisk组件中移动磁盘(TargetInstance.DriveType = 2)发生的属性实例(TargetInstance)。因为要监控U盘的所有操作事件,所以进行查询的是InstanceOperationEvent,如果只是监控U盘的插入事件则用InstanceCreationEvent。
-
- 这时我们设置了一个DO LOOP循环来实现对事件的无限监控(每隔5秒一次),objEvent.Path_.Class返回当前事件的属性状态,然后我们通过Select Case对当前的属性状态进行分类处理,本来有三种属性状态:InstanceCreationEvent、InstanceDeletionEvent、InstanceMotificationEvent,我们这里只对创建和删除事件即U盘的插入和移除状态进行了分类处理。
-
- 最后给出一段实时监控新增进程的代码,大家有兴趣的话可以研究探讨下:
复制代码
- On Error Resume Next
- Dim objWMI, objSHELL, objEvents, objEvent, Message, Return
- Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
- Set objSHELL = CreateObject("Wscript.Shell")
- Set objEvents = objWMI.ExecNotificationQuery _
- ("Select * From __InstanceCreationEvent Within 3 " _
- & "Where TargetInstance Isa 'Win32_Process'")
- Do While True
- Set objEvent = objEvents.NextEvent()
- Message = "新进程" & objEvent.TargetInstance.Name _
- & "被启动,请在10秒内点击确认允许,否则系统将强行关闭!"
- Return = objSHELL.Popup(Message,10,"系统警告",0+48)
- If Return = -1 Then
- Return = objEvent.TargetInstance.Terminate
- If return <> 0 Then
- Message = "进程" & objEvent.TargetInstance.Name _
- & "关闭失败,请尝试手动关闭!"
- objSHELL.Popup Message,3,"系统警告",0+48
- End If
- End If
- Loop
复制代码
|