网络中有很多示例说明如何订阅事件源(如RegistryValueChangeEvent
),并调用一些代码来响应该事件。
但有没有办法枚举这样的听众?例如,我想列出正在监听RegistryValueChangeEvent
的所有脚本或程序(例如它们的PID)。这在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
答案 0 :(得分:0)
这是“提供一些额外信息”但未解决问题的半答案之一
如果您想查看永久事件使用者,他们将在WMI root\subscription
命名空间(Win XP及更高版本)中注册。查找永久消费者需要的三件事的实例:__ EventFilter,__ EventConsumer(或其中一个派生类型)和__FilterToConsumerBinding。
不幸的是,这并没有解决如何找到临时事件使用者 - 调用ExecNotificationQueryAsync - 这就是您所询问的内容。
(但我想我会提到它,以防它有用。)