创建事件筛选器

事件筛选器是一个 WMI 类,用于描述 WMI 将哪些事件传递给物理使用者。 例如,事件筛选器可以指示 WMI 将所有电源管理事件或所有系统重启事件传送给使用者。 事件筛选器还描述 WMI 传递事件的条件。 事件过滤器可以指定内在或外在事件;筛选器可以引用源自命名空间(即筛选器的命名空间以外的事件)。 永久使用者在使用者、筛选器和绑定实例中必须具有相同的 CreatorSID。 有关详细信息,请参阅安全接收事件

以下过程介绍如何创建事件筛选器。

创建事件筛选器

  1. 创建 WMI __EventFilter 系统类的实例。

  2. 使用以下两种方式之一,使用 Name 属性为筛选器创建唯一标识符:

    • 使用专用方案。

      只要不与其他筛选器命名方案冲突,任意命名事件筛选器即有效。 必须避免命名冲突,因为添加具有重复 Name 值的实例会覆盖旧实例。

    • 使用全局唯一标识符 (GUID)。

      如果将“名称” 留空,则 WMI 会用 GUID 填充“名称”。

  3. 描述要使用 Query 属性筛选的事件类型。

    Query 属性包含描述要筛选的事件类型的 WMI 查询语言 (WQL) 查询。 可以使用 WQL 的各种运算符和扩展来实现精确筛选。

    当来自永久事件使用者的查询失败时,将生成 NT 日志事件。 事件的源为 WinMgmt,事件 ID 为 10,事件类型为“错误”。

    WMI 在处理限制性的特定查询的效率高于处理宽泛查询。 通过创建特定查询,可以避免不必要的进程间通信和网络流量。 在提供程序生成的事件的情况下,WMI 对提供程序执行进程中的筛选;这可确保只有与筛选器匹配的事件才会产生进程间通信成本。 有关详细信息,请参阅查询 WMI

  4. 将 QueryLanguage 属性设置为在 Query 属性中使用的查询语言类型。

    几乎总是将 QueryLanguage 设置为“WQL”。

下面的代码示例描述一个事件筛选器,该筛选器在每次 WMI 在 root\cimv2 命名空间中创建 __TimerEvent 类的实例时发出事件信号。

instance of __EventFilter as $FILTER
{
    Name = "MyFilterName";
    Query = "select * from __TimerEvent where TimerID=\"MyTimer\"";
    QueryLanguage = "WQL";
    EventNamespace = "\root\cimv2";

    // this is the Administrators SID in array of bytes format
    CreatorSID = {1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0}; 
};

EventNamespace 属性指定事件源自的命名空间。 不必在事件源自的命名空间中创建筛选器的实例。 如果未指定命名空间,则 WMI 会在默认命名空间中创建筛选器。 内部事件类(如 __InstanceOperationEvent)在每个命名空间中都可用。

若要为事件通知注册逻辑使用者,必须将事件筛选器绑定到逻辑使用者。 有关详细信息,请参阅将事件筛选器与逻辑使用者绑定