Compartir a través de


Interfaz IADsAccessControlList (iads.h)

La interfaz IADsAccessControlList es una interfaz dual que administra entradas de control de acceso individuales (ACE).

Herencia

La interfaz IADsAccessControlList hereda de la interfaz IDispatch . IADsAccessControlList también tiene estos tipos de miembros:

Métodos

La interfaz IADsAccessControlList tiene estos métodos.

 
IADsAccessControlList::AddAce

El método IADsAccessControlList::AddAce agrega un objeto IADsAccessControlEntry al objeto IADsAccessControlList.
IADsAccessControlList::CopyAccessList

El método IADsAccessControlList::CopyAccessList copia todas las entradas de control de acceso (ACE) de la lista de control de acceso (ACL) en el espacio de proceso del autor de la llamada.
IADsAccessControlList::get__NewEnum

El método IADsAccessControlList::get__NewEnum se usa para obtener un objeto enumerador para que la ACL enumere ACL.
IADsAccessControlList::RemoveAce

Quita una entrada de control de acceso (ACE) de la lista de control de acceso (ACL).

Comentarios

Una lista de control de acceso (ACL) es una colección de ACE que puede proporcionar un control de acceso más específico al mismo objeto ADSI para diferentes clientes. En general, los distintos proveedores implementan controles de acceso diferentes y, por lo tanto, el comportamiento del objeto es específico del proveedor. Para obtener más información, consulte la documentación del proveedor. Para obtener más información sobre los proveedores de Microsoft, consulta Proveedores de sistemas ADSI. Actualmente, solo el proveedor LDAP admite controles de acceso.

Antes de poder trabajar con una ACE de objeto, primero obtenga la ACL a la que pertenecen. Las ACL se administran mediante descriptores de seguridad y pueden ser de ACL discrecional y ACL del sistema. Para obtener más información, vea IADsSecurityDescriptor.

Con las propiedades y métodos de la interfaz IADsAccessControlList , puede recuperar y enumerar AE, agregar nuevas entradas a la lista o quitar entradas existentes.

Para administrar los controles de acceso a través de un ADSI

  1. En primer lugar, recupere el descriptor de seguridad del objeto que implementa la interfaz IADsSecurityDescriptor .
  2. En segundo lugar, recupere la ACL del descriptor de seguridad.
  3. En tercer lugar, trabaje con la ACE o ace del objeto en la ACL.

Para que las ACE nuevas o modificadas sean persistentes

  1. En primer lugar, agregue la ACE a la ACL.
  2. En segundo lugar, asigne la ACL al descriptor de seguridad.
  3. En tercer lugar, confirme el descriptor de seguridad en el almacén de directorios.
Para obtener más información sobre las DACL, vea DACL null y DACL vacías.

Ejemplos

En el ejemplo de código siguiente se muestra cómo trabajar con entradas de control de acceso de una ACL discrecional.

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

En el ejemplo de código siguiente se enumeran las ACE de una 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 Value
Cliente mínimo compatible Windows Vista
Servidor mínimo compatible Windows Server 2008
Plataforma de destino Windows
Encabezado iads.h

Consulte también

IADsAccessControlEntry

IADsSecurityDescriptor

IDispatch

DACL null y DACL vacías