安全地提供事件

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

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

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

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

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

    WMI 基于 SD 执行访问检查。 当提供程序不可以决定允许谁使用其事件但可以决定特定接收器的 SD 时,请使用此模式。 例如,如果事件提供程序通过调用 IWbemEventSink::GetRestrictedSink 获得多个接收器,而你想要为每个接收器设置一个安全描述符,则请使用 IWbemEventSink::SetSinkSecurity

  • 设置事件的 SECURITY_DESCRIPTOR 属性即可为每个事件设置 SD。

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

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

分离式事件提供程序与非分离式事件提供程序的区别在于它们向 WMI 注册的方式。 为来自分离式提供程序的事件调用 IWbemEventProviderSecurity::AccessCheck 从不传播客户端访问令牌。 WMI 处理访问控制的方式与处理非分离式事件提供程序的方式相同。 若要详细了解如何编写分离式提供程序,请参阅在应用程序中合并提供程序

只有在控制面板的“WMI 控制”中设置了 FULL_WRITE 权限的管理员才能为命名空间引发事件。 有关详细信息,请参阅使用 WMI 控件设置命名空间安全性

保护 WMI 事件