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 列舉值物件以列舉 ACL。
IADsAccessControlList::RemoveAce

從訪問控制清單 (ACE) 移除存取控制專案, (ACL) 。

備註

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