安全地提供事件

可以阻止未经授权的用户接收他们不应访问的事件。 事件提供程序可以提供其自己的事件类的实例,就像 系统注册表提供程序 提供 诸如 RegistryKeyChangeEvent 之类的类一样。 事件提供程序还可以传递内部事件,例如 __InstanceCreationEvent。 有关详细信息,请参阅 编写事件提供程序

事件提供程序可以通过以下方式控制对事件收件人的访问:

  • 通过实现 IWbemEventProviderSecurity::AccessCheck 来使用访问控制是最有效的方法。

    提供程序确定使用者是否有权接收请求的事件。 如果使用者没有足够的权限进行注册,WMI 将返回拒绝访问错误。 当提供程序可以决定谁可以接收事件时,请使用此模式。 例如,提供程序可能提供安全相关事件,并且可能要求使用者具有启用了 SeSecurityPrivilege 特权的管理员权限。

  • 在用于引发事件的接收器上实现 IWbemEventSink::SetSinkSecurity 允许为通过的所有事件设置安全描述符 (SD) 。

    WMI 基于 SD 执行访问检查。 当提供程序无法决定允许谁使用其事件时,请使用此模式,但可以决定特定接收器的 SD。 例如,如果事件提供程序通过调用 IWbemEventSink::GetRestrictedSink 获取 多个接收器,并且需要每个接收器的安全描述符,请使用 IWbemEventSink::SetSinkSecurity

  • 设置事件的 SECURITY_DESCRIPTOR 属性允许为每个事件设置 SD。

    当传递到接收器的每个事件可以具有不同的安全描述符时,请使用此方法。 若要使用此方法,请派生提供程序从 __Event__ExtrinsicEvent 定义的任何外向事件类,以便类包含 SECURITY_DESCRIPTOR 属性。 例如,事件提供程序可以通过接收器发布安全事件和正常事件。 在这种情况下,对安全事件使用 Administrators 帐户安全描述符,对任何人都可以接收的正常事件使用 NULL 安全描述符。

通过分离的事件提供程序保护事件

分离的事件提供程序不同于非解码事件提供程序,因为它们注册到 WMI 的方式。 从分离提供程序调用 IWbemEventProviderSecurity::AccessCheck 的事件永远不会传播客户端访问令牌。 WMI 以与非编码事件提供程序相同的方式处理访问控制。 有关编写分离提供程序的详细信息,请参阅 在应用程序中合并提供程序

仅允许在控制面板WMI 控件中设置FULL_WRITE特权的管理员为命名空间引发事件。 有关详细信息,请参阅 使用 WMI 控件设置命名空间安全性

保护 WMI 事件