1

网上有很多示例演示如何订阅事件源(如RegistryValueChangeEvent),并调用一些代码来响应该事件。

但是有没有办法枚举这样的听众?例如,我想列出所有正在收听RegistryValueChangeEvent. 这在 WMI 中可能吗?

这是一个示例脚本文件,监听注册表更改事件,我想检测:

strComputer = "."

Set objWMIServices=GetObject( _
    "winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default")

set objSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIServices.ExecNotificationQueryAsync objSink, _
    "Select * from RegistryValueChangeEvent Where " & _
    "Hive = 'HKEY_LOCAL_MACHINE' and " & _
    "KeyPath = 'SYSTEM\\ControlSet001\\Control' and " & _
    "ValueName = 'CurrentUser'"

WScript.Echo "Listening for Registry " _
    & "Change Events..." & vbCrLf 

While(True) 
    WScript.Sleep 1000 
Wend 

Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext) 
    WScript.Echo "Received Registry Value Change Event" _
    & vbCrLf & wmiObject.GetObjectText_() 
End Sub
4

1 回答 1

0

这是“提供一些附加信息”但不能解决您的问题的半答案之一

如果您想查看永久事件消费者,他们将在 WMIroot\subscription命名空间中注册(Win XP 及更高版本)。查找永久消费者所需的三件事的实例:__EventFilter、__EventConsumer(或派生类型之一)和 __FilterToConsumerBinding。

不幸的是,这并没有解决如何找到临时事件消费者 - 调用 ExecNotificationQueryAsync - 这是你所问的。
(但我想我会提到它以防万一它有帮助。)

于 2012-12-11T20:06:53.603 回答