【问题标题】:Enumerating the consumers of WMI Events枚举 WMI 事件的消费者
【发布时间】:2012-12-05 07:14:27
【问题描述】:

网上有很多例子演示了如何订阅事件源(如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

【问题讨论】:

    标签: windows wmi


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的洞察力。在我的搜索过程中,我看到了一些用于查看永久订阅列表的工具,这些工具由 Microsoft 编码并托管在他们的网站上。但临时订阅没有任何内容;我只能怀疑如果不利用 WMI 内部就无法做到这一点(希望我错了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2019-07-16
    相关资源
    最近更新 更多