注意:好吧,我们最好对最后一句陈述加以限定:只要您了解 WMI 事件构成的基本思想,就不那么难理解。如果您还不了解,最好花点时间看看脚本编写第 2 周网络广播。这个网络广播将为您提供了理解今天专栏文章所需的所有背景信息。
好主意!尽管可能没有有助于搞清楚我们的某一篇专栏文章的信息,但至少有助于搞清楚这个脚本代码的意思。
这个特定脚本的开始是以历史悠久的方式连接到本地计算机上的 WMI 服务。通常到这里,我们要执行 WMI 查询以返回信息。正如您所看到的,在这个脚本中我们也要这么做,只是查询看起来有点不同:
Set objEventSource = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'")
不用说,这不是您所习惯编写的 WMI 查询类型,因为我们调用的是 ExecNotificationQuery 方法,而不是 ExecQuery。(为什么呢?因为要监控 WMI 事件,就必须使用 ExecNotificationQuery 方法。)今天我们无法详细解释这个查询,但我们可以说,我们要求 WMI 只要有 WMI 事件(创建、删除、修改)发生,就立刻通知我们。这里只有一个问题:我们只想当 TargetInstance(创建、删除或修改的项目)是 Win32_Process 类的实例时才得到通知。
注意:当然,从技术角度来说,还有第二个问题:我们只是每 5 秒钟检查一次新事件。如果屏幕保护程序启动,3 秒钟之后结束,我们很可能就不会得到通知了。
换句话说,假设创建了一个新文件。新文件是 Win32_Process 类的实例吗?不是;它是 CIM_DataFile 类的实例。因此,我们不想得到通知。假设修改了一个服务。我们想要得到通知吗?不想要,因为服务是 Win32_Service 类的实例。好了,假设新进程(例如屏幕保护程序)启动。我们想要得到通知吗?当然想要。别忘了,新进程可是 Win32_Process 类的实例。任何时候如果创建、删除或修改进程,我们都想得到通知。
不过,这些您已经意识到了,对吧?
为了获得这些通知,我们建立一个当 True 等于 True 时运行的 Do 循环:
Do While True
句子的语法确实有点怪异,但这个语法却能够使脚本不停运行,并且不停监控进程的创建、删除和修改,直到终止脚本或重新启动计算机。如果没有这样的循环,脚本会通知我们屏幕保护程序何时启动,但是,随后脚本就会结束。结果,我们永远也不会得到屏幕保护程序何时结束的通知。
在循环内,我们首先要做的就是执行下面这行代码:







