随时接收事件

用户可能希望编写一个随时可以响应事件的应用程序。 例如,当网络服务器上的特定性能度量下降时,管理员可能希望收到电子邮件。 在这种情况下,应用程序应随时运行。 但是,持续运行应用程序并不能高效地利用系统资源。 而 WMI 允许创建永久事件使用者。 永久事件使用者必须满足特殊的安全要求。 有关详细信息,请参阅保护 WMI 事件

永久事件使用者接收事件,直到显式取消其注册。

永久事件使用者是驻留在系统上的以下 WMI 类、筛选器和 COM 对象的组合:

  • 一个称为物理使用者的 COM 对象。 WMI 提供多个标准的永久使用者。 例如,活动脚本事件使用者在事件发生时运行脚本
  • 新的永久使用者类。
  • 称为逻辑使用者的永久使用者类的实例。
  • 包含事件查询的筛选器。
  • 使用者与筛选器之间的链接。

逻辑事件使用者的属性指定在收到事件通知时要执行的操作,但不定义与其关联的事件查询。 收到信号后,WMI 会自动将表示永久事件使用者的 COM 对象加载到活动内存中。 通常,这发生在启动期间,或是为了响应触发事件。 激活后,永久事件使用者充当普通事件使用者,但会一直保留,直到操作系统专门将其卸载。

可以编写自己的永久事件使用者,也可以使用 WMI 预安装的标准使用者类,例如 ActiveScriptEventConsumer。 有关详细信息,请参阅标准使用者类使用标准使用者监视和响应事件监视事件

以下过程介绍如何创建自己的永久事件使用者。

创建自己的永久事件使用者

  1. 确定想要接收的事件类型。

    WMI 支持内部和外部事件。 内部事件是由 WMI 预定义的事件,而外部事件是由第三方提供程序定义的事件。 有关详细信息,请参阅确定要接收的事件类型

  2. 实现物理使用者

    管理应用程序和物理使用者之间的主要区别在于,用户加载和卸载管理应用程序,而 WMI 加载和卸载物理使用者。 大多数编码应位于物理使用者中。

    注意

    为方便说明,此步骤是过程中的第一步。 在编码方面,实际上应该最后创建物理使用者。 这样就可以在开始长时间编码之前为永久事件提供程序设置参数和逻辑布局。 但是,对首先编写物理使用者没有限制。

     

  3. 创建描述物理使用者的新使用者类

    与任何类一样,使用者类向 WMI 描述永久事件使用者的一般参数。

  4. 创建使用者类的实例

    与任何其他 WMI 类一样,如果要实现类,则必须创建使用者类的实例。 使用者类的实例也称为逻辑使用者。 逻辑使用者表示 WMI 的物理使用者。

  5. 创建事件筛选器

    激活永久事件使用者的事件查询称为事件筛选器。 单个事件筛选器可以与多个逻辑事件使用者相关联。 此外,多个事件筛选器可以与单个逻辑事件使用者相关联。 筛选器是 __EventFilter 的实例。

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

  6. 将事件筛选器链接到逻辑使用者

    通过将事件筛选器链接到逻辑使用者,可以指示 WMI 了解哪个事件筛选器属于哪个逻辑使用者。 逻辑事件使用者和事件筛选器由 __FilterToConsumerBinding 的关联类实例进行链接。 收到与事件筛选器中描述的事件查询匹配的事件时,WMI 通过查看关联类实例来查找关联的逻辑事件使用者。 找到逻辑事件使用者实例后,WMI 使用 __EventConsumerProviderRegistration 类的实例来查找并运行与此实例关联的物理事件使用者。

  7. 编写事件使用者提供程序

    事件使用者提供程序是一个 COM 对象,用于查找 WMI 的物理使用者。