Interface IADsAccessControlList (iads.h)

L’interface IADsAccessControlList est une interface double qui gère les entrées de contrôle d’accès (ACÉ) individuelles.

Héritage

L’interface IADsAccessControlList hérite de l’interface IDispatch. IADsAccessControlList a également les types de membres suivants :

Méthodes

L’interface IADsAccessControlList utilise ces méthodes.

 
IADsAccessControlList ::AddAce

La méthode IADsAccessControlList ::AddAce ajoute un objet IADsAccessControlEntry à l’objet IADsAccessControlList.
IADsAccessControlList ::CopyAccessList

La méthode IADsAccessControlList ::CopyAccessList copie chaque entrée de contrôle d’accès (ACE) de la liste de contrôle d’accès (ACL) dans l’espace de processus de l’appelant.
IADsAccessControlList ::get__NewEnum

La méthode IADsAccessControlList ::get__NewEnum est utilisée pour obtenir un objet énumérateur pour la liste de contrôle d’accès afin d’énumérer les AES.
IADsAccessControlList ::RemoveAce

Supprime une entrée de contrôle d’accès (ACE) de la liste de contrôle d’accès (ACL).

Remarques

Une liste de contrôle d’accès (ACL) est une collection d’ACL qui peut fournir un contrôle d’accès plus spécifique au même objet ADSI pour différents clients. En général, différents fournisseurs implémentent des contrôles d’accès différents et, par conséquent, le comportement de l’objet est spécifique au fournisseur. Pour plus d’informations, consultez la documentation du fournisseur. Pour plus d’informations sur les fournisseurs Microsoft, consultez Fournisseurs de système ADSI. Actuellement, seul le fournisseur LDAP prend en charge les contrôles d’accès.

Avant de pouvoir travailler avec un ACE d’objet, commencez par obtenir la liste de contrôle d’accès à laquelle ils appartiennent. Les listes de contrôle d’accès sont gérées par des descripteurs de sécurité et peuvent être de liste de contrôle d’accès discrétionnaire et de liste de contrôle d’accès système. Pour plus d’informations, consultez IADsSecurityDescriptor.

À l’aide des propriétés et des méthodes de l’interface IADsAccessControlList , vous pouvez récupérer et énumérer des acees, ajouter de nouvelles entrées à la liste ou supprimer des entrées existantes.

Pour gérer les contrôles d’accès sur un ADSI

  1. Tout d’abord, récupérez le descripteur de sécurité de l’objet qui implémente l’interface IADsSecurityDescriptor .
  2. Ensuite, récupérez la liste de contrôle d’accès à partir du descripteur de sécurité.
  3. Troisièmement, utilisez l’ACE, ou ACÉ, de l’objet dans la liste de contrôle d’accès.

Pour rendre les ACE nouveaux ou modifiés persistants

  1. Tout d’abord, ajoutez l’ACE à la liste de contrôle d’accès.
  2. Ensuite, affectez la liste de contrôle d’accès au descripteur de sécurité.
  3. Troisièmement, validez le descripteur de sécurité dans le magasin d’annuaires.
Pour plus d’informations sur les DACL, consultez DACL Null et DACL vides.

Exemples

L’exemple de code suivant montre comment utiliser les entrées de contrôle d’accès d’une liste de contrôle d’accès discrétionnaire.

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

L’exemple de code suivant énumère les ACL à partir d’une liste 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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista
Serveur minimal pris en charge Windows Server 2008
Plateforme cible Windows
En-tête iads.h

Voir aussi

IADsAccessControlEntry

IADsSecurityDescriptor

IDispatch

DACL Null et DACL vides