IADsAccessControlList 接口 (iads.h)

IADsAccessControlList 接口是一个双重接口,用于管理各个访问控制项 (ACE) 。

继承

IADsAccessControlList 接口继承自 IDispatch 接口。 IADsAccessControlList 也包含以下类型的成员:

方法

IADsAccessControlList 接口包含以下方法。

 
IADsAccessControlList::AddAce

IADsAccessControlList::AddAce 方法将 IADsAccessControlEntry 对象添加到 IADsAccessControlList 对象。
IADsAccessControlList::CopyAccessList

IADsAccessControlList::CopyAccessList 方法将访问控制列表中的每个访问控制项 (ACE) 复制到调用方的进程空间 (ACL) 。
IADsAccessControlList::get__NewEnum

IADsAccessControlList::get__NewEnum 方法用于获取 ACL 的枚举器对象以枚举 ACE。
IADsAccessControlList::RemoveAce

从访问控制列表 (ACL) ) 中删除 ACE (访问控制项。

注解

ACL) (访问控制列表是 ACE 的集合,可为不同客户端的同一 ADSI 对象提供更具体的访问控制。 通常,不同的提供程序实现不同的访问控制,因此对象的行为特定于提供程序。 有关详细信息,请参阅提供程序文档。 有关 Microsoft 提供程序的详细信息,请参阅 ADSI 系统提供程序。 目前,只有 LDAP 提供程序支持访问控制。

在使用对象 ACE 之前,请先获取它们所属的 ACL。 ACL 由安全描述符管理,可以是任意 ACL 和系统 ACL。 有关详细信息,请参阅 IADsSecurityDescriptor

使用 IADsAccessControlList 接口的属性和方法,可以检索和枚举 ACE、向列表添加新条目或删除现有条目。

管理对 ADSI 的访问控制

  1. 首先,检索实现 IADsSecurityDescriptor 接口的对象的安全描述符。
  2. 其次,从安全描述符中检索 ACL。
  3. 第三,使用 ACL 中 对象的 ACE 或 ACE。

使任何新的或修改的 ACE 持久化

  1. 首先,将 ACE 添加到 ACL。
  2. 其次,将 ACL 分配给安全描述符。
  3. 第三,将安全描述符提交到目录存储。
有关 DACL 的详细信息,请参阅 Null DACL 和空 DACL

示例

下面的代码示例演示如何使用任意 ACL 的访问控制条目。

Dim X As IADs
Dim Namespace As IADsOpenDSObject
Dim SecurityDescriptor As IADsSecurityDescriptor
Dim Dacl As IADsAccessControlList

On Error GoTo Cleanup
 
Set Namespace = GetObject("LDAP://")
Set X= Namespace.OpenDSObject("LDAP://DC=Fabrikam,DC=Com, vbNullString, vbNullString,  ADS_SECURE_AUTHENTICATION)
 
Set SecurityDescriptor = X.Get("ntSecurityDescriptor")
Debug.Print SecurityDescriptor.Owner
Debug.Print SecurityDescriptor.Group
 
Set Dacl = SecurityDescriptor.DiscretionaryAcl
Debug.Print Dacl.AceCount
 
For Each Obj In Dacl
   Debug.Print Obj.Trustee
   Debug.Print Obj.AccessMask
   Debug.Print Obj.AceFlags
   Debug.Print Obj.AceType
Next

Cleanup:
    If (Err.Number<>0) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If
    Set X = Nothing
    Set Namespace = Nothing
    Set SecurityDescriptor = Nothing
    Set Dacl = Nothing

下面的代码示例枚举 DACL 中的 ACE。

IADs *pADs = NULL;
IDispatch *pDisp = NULL;
IADsSecurityDescriptor *pSD = NULL;
VARIANT var;
HRESULT hr = S_OK;
 
VariantInit(&var);

hr = ADsOpenObject(L"LDAP://OU=Sales, DC=Fabrikam,DC=com",NULL,NULL,
                   ADS_SECURE_AUTHENTICATION, IID_IADs,(void**)&pADs);
if(FAILED(hr)) {goto Cleanup;}

hr = pADs->Get(CComBSTR("ntSecurityDescriptor"), &var);
if(FAILED(hr)) {goto Cleanup;}

pDisp = V_DISPATCH(&var);

hr = pDisp->QueryInterface(IID_IADsSecurityDescriptor,(void**)&pSD);
if(FAILED(hr)) {goto Cleanup;}
pDisp->Release();


pSD->get_DiscretionaryAcl(&pDisp);

hr = pDisp->QueryInterface(IID_IADsAccessControlList,(void**)&pACL);
if(FAILED(hr)) {goto Cleanup;}

hr = DisplayAccessInfo(pSD);
if(FAILED(hr)) {goto Cleanup;}
VariantClear(&var);

Cleanup:
    if(pADs) pADs->Release();
    if(pDisp) pDisp->Release();
    if(pSD) pSD->Release();
    return hr;



HRESULT DisplayAccessInfo(IADsSecurityDescriptor *pSD)
{
    LPWSTR lpszFunction = L"DisplayAccessInfo";
    IDispatch *pDisp = NULL;
    IADsAccessControlList *pACL = NULL;
    IADsAccessControlEntry *pACE = NULL;
    IEnumVARIANT *pEnum = NULL;
    IUnknown *pUnk = NULL;
    HRESULT hr = S_OK;
    ULONG nFetch = 0;
    BSTR bstrValue = NULL;
    VARIANT var;
    LPWSTR lpszOutput = NULL;
    LPWSTR lpszMask = NULL;
    size_t nLength = 0;
    
    VariantInit(&var);
    
    hr = pSD->get_DiscretionaryAcl(&pDisp);
    if(FAILED(hr)){goto Cleanup;}
    hr = pDisp->QueryInterface(IID_IADsAccessControlList,(void**)&pACL);
    if(FAILED(hr)){goto Cleanup;}
    
    hr = pACL->get__NewEnum(&pUnk);
    if(FAILED(hr)){goto Cleanup;}
    
    hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
    
    if(FAILED(hr)){goto Cleanup;}
    hr = pEnum->Next(1,&var,&nFetch);
    
    while(hr == S_OK)
    {
        if(nFetch==1)
        {
            if(VT_DISPATCH != V_VT(&var))
            {
                goto Cleanup;
            }
            
            pDisp = V_DISPATCH(&var);
            hr = pDisp->QueryInterface(IID_IADsAccessControlEntry,(void**)&pACE);
            
            if(SUCCEEDED(hr))
            {
                lpszMask = L"Trustee: %s";
                hr = pACE->get_Trustee(&bstrValue);
                nLength = wcslen(lpszMask) + wcslen(bstrValue) + 1;
                lpszOutput = new WCHAR[nLength];
                swprintf_s(lpszOutput,lpszMask,bstrValue);
                printf(lpszOutput);
                delete [] lpszOutput;
                SysFreeString(bstrValue);
                
                pACE->Release();
                pACE = NULL;
                pDisp->Release();
                pDisp = NULL;
            }       
            
            VariantClear(&var);
        }       
        hr = pEnum->Next(1,&var,&nFetch);
    }
    
Cleanup:
    if(pDisp) pDisp->Release();
    if(pACL) pACL->Release();
    if(pACE) pACE->Release();
    if(pEnum) pEnum->Release();
    if(pUnk) pUnk->Release();
    if(szValue) SysFreeString(szValue);
    return hr;
}

要求

要求
最低受支持的客户端 Windows Vista
最低受支持的服务器 Windows Server 2008
目标平台 Windows
标头 iads.h

另请参阅

IADsAccessControlEntry

IADsSecurityDescriptor

IDispatch

Null DACL 和空 DACL