Interface IADsAccessControlList (iads.h)

A interface IADsAccessControlList é uma interface dupla que gerencia ACEs (entradas de controle de acesso) individuais.

Herança

A interface IADsAccessControlList herda da interface IDispatch . IADsAccessControlList também tem estes tipos de membros:

Métodos

A interface IADsAccessControlList tem esses métodos.

 
IADsAccessControlList::AddAce

O método IADsAccessControlList::AddAce adiciona um objeto IADsAccessControlEntry ao objeto IADsAccessControlList.
IADsAccessControlList::CopyAccessList

O método IADsAccessControlList::CopyAccessList copia cada ACE (entrada de controle de acesso) na ACL (lista de controle de acesso) para o espaço de processo do chamador.
IADsAccessControlList::get__NewEnum

O método IADsAccessControlList::get__NewEnum é usado para obter um objeto enumerador para a ACL enumerar ACEs.
IADsAccessControlList::RemoveAce

Remove uma ACE (entrada de controle de acesso) da ACL (lista de controle de acesso).

Comentários

Uma ACL (lista de controle de acesso) é uma coleção de ACEs que podem fornecer controle de acesso mais específico ao mesmo objeto ADSI para clientes diferentes. Em geral, diferentes provedores implementam controles de acesso diferentes e, portanto, o comportamento do objeto é específico para o provedor. Para obter mais informações, consulte a documentação do provedor. Para obter mais informações sobre provedores da Microsoft, consulte Provedores de sistema ADSI. Atualmente, somente o provedor LDAP dá suporte a controles de acesso.

Antes de trabalhar com um OBJETO ACE, primeiro obtenha a ACL à qual eles pertencem. As ACLs são gerenciadas por descritores de segurança e podem ser de ACL discricionária e ACL do sistema. Para obter mais informações, consulte IADsSecurityDescriptor.

Usando as propriedades e os métodos da interface IADsAccessControlList , você pode recuperar e enumerar ACEs, adicionar novas entradas à lista ou remover entradas existentes.

Para gerenciar controles de acesso em um ADSI

  1. Primeiro, recupere o descritor de segurança do objeto que implementa a interface IADsSecurityDescriptor .
  2. Em segundo lugar, recupere a ACL do descritor de segurança.
  3. Em terceiro lugar, trabalhe com o ACE, ou ACEs, do objeto na ACL.

Para tornar os ACEs novos ou modificados persistentes

  1. Primeiro, adicione o ACE à ACL.
  2. Em segundo lugar, atribua a ACL ao descritor de segurança.
  3. Em terceiro lugar, confirme o descritor de segurança no repositório de diretórios.
Para obter mais informações sobre DACLs, consulte DACLs nulos e DACLs vazios.

Exemplos

O exemplo de código a seguir mostra como trabalhar com entradas de controle de acesso de uma ACL discricionária.

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

O exemplo de código a seguir enumera ACEs de uma 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;
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista
Servidor mínimo com suporte Windows Server 2008
Plataforma de Destino Windows
Cabeçalho iads.h

Confira também

IADsAccessControlEntry

IADsSecurityDescriptor

IDispatch

DACLs nulos e DACLs vazias