Board logo

标题: [原创] VBS如何通过WMI实现事件监控 [打印本页]

作者: batman    时间: 2013-9-2 22:23     标题: VBS如何通过WMI实现事件监控

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

作者: xpw    时间: 2013-9-2 23:21

佩服!!佩服!!cmd、vbs、powershell和wmic,能精通这四种的话,基本上就可以不用鼠标了。batman最近在研究wmic吧
作者: batman    时间: 2013-9-3 08:33

本帖最后由 batman 于 2013-9-3 08:36 编辑

回复 2# xpw


    WMIC不是WMI,它是WMI的扩展,为WMI名称空间提供了命令行接口。它与WMI最大的区别是它使用了别名机制,用户可以利用这个机制使用GET命令来完成WQL查询。如我们要查询主机中所有的硬盘盘符,可用wmic logicaldisk where drivetype=3 get deviceid。当然WMIC和WMI访问和管理API组件的模式是一样的,我认为知道融会贯通的人只习其一便可知其二。。。
作者: PowerShell    时间: 2013-9-3 09:48

解说的好,支持。
作者: allen2023    时间: 2023-11-20 10:08

回复 1# batman


   新增进程没有提示。win10




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2