随时接收事件
你可能想要编写一个应用程序,该应用程序可以随时对事件做出响应。 例如,当网络服务器上的特定性能度量下降时,管理员可能想要接收电子邮件。 在这种情况下,应用程序应随时运行。 但是,持续运行应用程序并不是系统资源的高效使用。 相反,WMI 允许创建永久事件使用者。 永久性事件使用者必须满足特殊的安全要求。 有关详细信息,请参阅 保护 WMI 事件。
永久事件使用者在显式取消注册之前接收事件。
永久事件使用者是驻留在系统上的以下 WMI 类、筛选器和 COM 对象的组合:
- 称为物理使用者的 COM 对象。 WMI 提供多个标准永久使用者。 例如,活动脚本事件使用者 在事件发生时运行脚本。
- 新的永久使用者类。
- 称为逻辑使用者的永久使用者类的实例。
- 包含事件的查询的筛选器。
- 使用者与筛选器之间的链接。
逻辑事件使用者的属性指定在通知事件时要执行的操作,但不定义与其关联的事件查询。 发出信号时,WMI 会自动将表示永久事件使用者的 COM 对象加载到活动内存中。 通常,在启动期间或响应触发事件时会出现这种情况。 激活后,永久性事件使用者充当正常事件使用者,但一直保留到操作系统专门卸载为止。
可以编写自己的永久事件使用者或使用 WMI 预安装 的标准使用者类,例如 ActiveScriptEventConsumer。 有关详细信息,请参阅 标准使用者类、 使用标准使用者监视和响应事件以及 监视事件。
以下过程介绍如何创建自己的永久事件使用者。
创建自己的永久事件使用者
确定要接收的事件类型。
WMI 支持固有和外在事件。 内部事件是由 WMI 预定义的事件,而外在事件是由第三方提供程序定义的事件。 有关详细信息,请参阅 确定要接收的事件类型。
-
管理应用程序和 物理使用者 之间的主要区别是用户加载和卸载管理应用程序,而 WMI 加载和卸载物理使用者。 大多数编码应位于物理使用者中。
注意
此步骤首先在过程中进行解释。 在编码方面,实际上应该最后创建物理使用者。 这样,就可以在开始长时间编码之前为永久事件提供程序布局参数和逻辑。 但是,对先编写物理使用者没有限制。
-
与任何类一样,使用者类将永久事件使用者的常规参数描述为 WMI。
-
与任何其他 WMI 类一样,如果要实现类,则必须创建使用者类的实例。 使用者类的实例也称为 逻辑使用者。 逻辑使用者表示 WMI 的物理使用者。
-
激活永久事件使用者的事件查询称为 事件筛选器。 单个事件筛选器可以与多个逻辑事件使用者相关联。 此外,多个事件筛选器可以与单个逻辑事件使用者相关联。 筛选器是 __EventFilter的实例。
当永久事件使用者的查询失败时,会生成 NT 日志事件。 事件的源为 WinMgmt,事件 ID 为 10,事件类型为 Error。
-
通过将事件筛选器链接到逻辑使用者,可以指示 WMI 了解哪个事件筛选器属于哪个逻辑使用者。 逻辑事件使用者和事件筛选器由 __FilterToConsumerBinding的关联类实例链接。 收到与事件筛选器中描述的事件查询匹配的事件时,WMI 通过查看关联类实例查找关联的逻辑事件使用者。 找到逻辑事件使用者实例后,WMI 使用 __EventConsumerProviderRegistration 类的实例来查找并运行与此实例关联的物理事件使用者。
-
事件使用者提供程序是一个 COM 对象,用于查找 WMI 的物理使用者。