编写事件提供程序

事件提供程序是一个 COM 对象,它向 WMI 提供固有和外在事件的通知。 内部事件向 WMI 报告内部数据更改,而外在事件报告未由内部事件描述的用户定义事件。 例如,响应更改、创建或删除 Win32_LogicalDisk 类的事件将分类为固有事件。 基于现有 WMI 对象的修改、创建或删除以外的内容生成的事件是一个外在事件。 无论受支持的类如何,都可以以相同的方式实现所有事件提供程序。

以下过程介绍如何实现事件提供程序。

实现事件提供程序

  1. 使用 WMI 设计和注册类提供程序。

    类提供程序通过创建 __Win32Provider 实例和 __EventProviderRegistration 类向 WMI 注册。 有关详细信息,请参阅 注册事件提供程序

  2. 为提供程序实现 IWbemProviderInit 接口。

    IWbemProviderInit 接口是用于加载和初始化所有提供程序的常见接口 WMI。 有关详细信息,请参阅 初始化提供程序

  3. 实现 IWbemEventProvider 作为提供程序的主接口。

    IWbemEventProvider 接口使用 ProviderEvents 方法向 WMI 提供事件。 有关详细信息,请参阅 实现事件提供程序的主接口

    注意

    事件提供程序必须使用多线程模型“Both”。

     

  4. (可选)还可以实现 IWbemEventProviderQuerySink 接口,以提高事件提供程序的性能。

    IWbemEventProviderQuerySink 接口允许提供程序在向 WMI 发送响应之前优化查询,并且对于提供多种类型的事件且需要尽可能多的内部优化的提供程序最有用。 有关详细信息,请参阅 优化事件提供程序

  5. 实现 IWbemEventProviderSecurity 接口,以将使用者限制为某些安全标识符, (SID) 或实现 IWbemEventSink::SetSinkSecurity 来保护接收器本身。 提供程序还可以在事件类中设置 SECURITY_DESCRIPTOR 属性,以保护 MOF 代码中的单个事件。 有关详细信息,请参阅 保护 WMI 事件

  6. 添加提供程序所需的任何其他代码。

    设计提供程序时,你最可能需要调用 WMI 接口。 有关详细信息,请参阅 调用方法

    检索客户端的信息时,可能需要访问该客户端的安全级别。 有关详细信息,请参阅 模拟客户端

  7. 将预先存在的提供程序替换为新代码。

    如果没有预先存在的提供程序来复制,则无需执行此步骤。 有关详细信息,请参阅 更新提供程序

客户端应用程序可以通过将自身注册到 WMI 作为事件使用者来请求事件。 有关详细信息,请参阅 接收 WMI 事件