2012-12-05 37 views
1

有在网许多例子被展示如何订阅事件源(如RegistryValueChangeEvent),并且响应于该事件调用一些代码。枚举WMI事件的消费者

但是,有没有办法一一列举这样的听众?例如,我想列出正在听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

这是那些半答案的一个“给出了一些额外的信息”,但没有按“不能解决你的问题

如果你想看到的永久事件的消费者,他们会在WMI root\subscription命名空间(Win XP的&后)进行注册。寻找的三件事是实例永久消费者要求:__EventFilter,__EventConsumer(或派生类型中的一种),并__FilterToConsumerBinding。

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

+0

感谢您的洞察力。在我搜索我已经看到了一些工具来查看永久订阅列表,由微软编码,并在其网站上托管。但临时订阅没有任何内容;我只能怀疑这离不开利用WMI内部(希望我是错的)来完成。 – antonone