编写事件提供程序

事件提供程序是一个 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 事件