IWbemEventSink::SetSinkSecurity 方法 (wbemprov.h)

IWbemEventSink::SetSinkSecurity 方法用于为通过的所有事件设置安全描述符 (SD) 。 WMI 基于 SD 处理访问检查。 当提供程序无法控制允许哪些用户使用其事件,但可以为特定接收器设置 SD 时,请使用此方法。

语法

HRESULT SetSinkSecurity(
  [in] long lSDLength,
  [in] BYTE *pSD
);

参数

[in] lSDLength

安全描述符的长度。

[in] pSD

安全描述符,DACL。

返回值

此方法返回指示方法调用状态的 HRESULT。 以下列表列出了 HRESULT 中包含的值。

注解

SD DACL 定义谁有权访问事件。 寻求访问传递到接收器的事件的使用者 (ACE) 访问控制项必须与 pSD 参数中设置WBEM_RIGHT_SUBSCRIBE的 ACE 匹配。 SD 所有者和组指定引发事件时要使用的标识。 此标识可以不同于引发事件的帐户的标识;但是,当针对筛选器 SD 检查事件的访问权限时,将同时检查用户的标识和所有者字段中指定的标识是否具有访问权限。 有关详细信息,请参阅 __EventFilter 类的 EventAccess 属性。 必须设置 SD 的组字段,并且不使用 SACL 字段。 有关事件安全性和何时使用此方法的详细信息,请参阅 保护 WMI 事件

有关提供事件的详细信息,请参阅 编写事件提供程序

示例

下面的代码示例为通过接收器提供的所有事件设置 SD。代码需要以下 #include 语句和引用。

#define _WIN32_WINNT 0x0500
#define SECURITY_WIN32
#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "Secur32.lib")
#include <windows.h>
#include <sddl.h>
#include <wbemidl.h>
#include <security.h>
#include <iostream>
using namespace std;

HRESULT CMyEventProvider::ProvideEvents( IWbemObjectSink *pSink,
                                            long lFlags )
{
    IWbemEventSink *pEventSink = NULL;
    //Create SD with allowing only administrators
    // to receive events. O:BAG:BAD:(A;;0x40;;;BA)
     long lMask = WBEM_RIGHT_SUBSCRIBE;
     WCHAR wBuf[MAX_PATH];
     _ltow( lMask, wBuf, 16 );
 
       wstring wstrSD = L"O:BAG:BAD:(A;;0x";
        wstrSD += lMask;
       wstrSD += L";;;BA)";
    ULONG ulSize = 0;
    PSECURITY_DESCRIPTOR pSD = NULL;
 
    ConvertStringSecurityDescriptorToSecurityDescriptorW(
        wstrSD.c_str(), SDDL_REVISION_1, &pSD, &ulSize ); 
    HRESULT hRes = pSink->QueryInterface( IID_IWbemEventSink,
        (void**)pEventSink );
    if( SUCCEEDED(hRes) )
        hRes = pEventSink->SetSinkSecurity( ulLength, pSD );
    LocalFree(pSD );
    return hRes;
}

要求

   
最低受支持的客户端 Windows Vista
最低受支持的服务器 Windows Server 2008
目标平台 Windows
标头 wbemprov.h (包括 Wbemidl.h)
Library Wbemuuid.lib
DLL Wbemsvc.dll