枚举WMI事件的使用者

时间:2012-12-05 07:14:28

标签: windows wmi

网络中有很多示例说明如何订阅事件源(如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

1 个答案:

答案 0 :(得分:0)

这是“提供一些额外信息”但未解决问题的半答案之一

如果您想查看永久事件使用者,他们将在WMI root\subscription命名空间(Win XP及更高版本)中注册。查找永久消费者需要的三件事的实例:__ EventFilter,__ EventConsumer(或其中一个派生类型)和__FilterToConsumerBinding。

不幸的是,这并没有解决如何找到临时事件使用者 - 调用ExecNotificationQueryAsync - 这就是您所询问的内容。
(但我想我会提到它,以防它有用。)