Интерфейс 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

Удаляет запись управления доступом (ACE) из списка управления доступом (ACL).

Комментарии

Список управления доступом (ACL) — это коллекция ACE, которая может предоставлять более точное управление доступом к одному и тому же объекту ADSI для разных клиентов. Как правило, разные поставщики реализуют различные элементы управления доступом, поэтому поведение объекта зависит от поставщика. Дополнительные сведения см. в документации по поставщику. Дополнительные сведения о поставщиках Майкрософт см. в разделе Поставщики системы ADSI. В настоящее время только поставщик LDAP поддерживает элементы управления доступом.

Прежде чем работать с ACE объекта, сначала получите список ACL, к которому они принадлежат. Списки управления доступом управляются дескрипторами безопасности и могут иметь как дискреционный список ACL, так и системный ACL. Дополнительные сведения см. в разделе IADsSecurityDescriptor.

С помощью свойств и методов интерфейса IADsAccessControlList можно получать и перечислять ACE, добавлять новые записи в список или удалять существующие.

Управление элементами управления доступом через ADSI

  1. Сначала получите дескриптор безопасности объекта, реализующего интерфейс IADsSecurityDescriptor .
  2. Во-вторых, получите список управления доступом из дескриптора безопасности.
  3. В-третьих, работайте с ACE или ACE объекта в списке ACL.

Создание постоянных новых или измененных ACE

  1. Сначала добавьте ACE в список ACL.
  2. Во-вторых, назначьте ACL дескриптору безопасности.
  3. В-третьих, зафиксируйте дескриптор безопасности в хранилище каталогов.
Дополнительные сведения о списках DACLs см. в разделах Списки DACLs null и Пустые списки DACLs.

Примеры

В следующем примере кода показано, как работать с записями управления доступом для списка 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

В следующем примере кода перечисляются ACE из DACL.

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
Header iads.h

См. также раздел

IADsAccessControlEntry

IADsSecurityDescriptor

IDispatch

Списки DACLs null и пустые списки DACLs