IADsAccessControlList 인터페이스(iads.h)

IADsAccessControlList 인터페이스는 개별 ACE(액세스 제어 항목)를 관리하는 이중 인터페이스입니다.

상속

IADsAccessControlList 인터페이스는 IDispatch 인터페이스에서 상속됩니다. IADsAccessControlList 에는 다음과 같은 유형의 멤버도 있습니다.

메서드

IADsAccessControlList 인터페이스에는 이러한 메서드가 있습니다.

 
IADsAccessControlList::AddAce

IADsAccessControlList::AddAce 메서드는 IADsAccessControlEntry 개체를 IADsAccessControlList 개체에 추가합니다.
IADsAccessControlList::CopyAccessList

IADsAccessControlList::CopyAccessList 메서드는 ACL(액세스 제어 목록)의 모든 ACE(액세스 제어 항목)를 호출자의 프로세스 공간에 복사합니다.
IADsAccessControlList::get__NewEnum

IADsAccessControlList::get__NewEnum 메서드는 ACL에서 ACL을 열거할 열거자 개체를 가져오는 데 사용됩니다.
IADsAccessControlList::RemoveAce

ACL(액세스 제어 목록)에서 ACE(액세스 제어 항목)를 제거합니다.

설명

ACL(액세스 제어 목록)은 다른 클라이언트에 대해 동일한 ADSI 개체에 보다 구체적인 액세스 제어를 제공할 수 있는 API 컬렉션입니다. 일반적으로 공급자가 서로 다른 액세스 제어를 구현하므로 개체의 동작은 공급자와 관련이 있습니다. 자세한 내용은 공급자 설명서를 참조하세요. Microsoft 공급자에 대한 자세한 내용은 ADSI 시스템 공급자를 참조하세요. 현재 LDAP 공급자만 액세스 제어를 지원합니다.

개체 ACE로 작업하려면 먼저 해당 개체가 속한 ACL을 가져옵니다. ACL은 보안 설명자에 의해 관리되며 임의 ACL 및 시스템 ACL일 수 있습니다. 자세한 내용은 IADsSecurityDescriptor를 참조하세요.

IADsAccessControlList 인터페이스의 속성과 메서드를 사용하여 ACE를 검색 및 열거하거나, 목록에 새 항목을 추가하거나, 기존 항목을 제거할 수 있습니다.

ADSI에 대한 액세스 제어를 관리하려면

  1. 먼저 IADsSecurityDescriptor 인터페이스를 구현하는 개체의 보안 설명자를 검색합니다.
  2. 둘째, 보안 설명자에서 ACL을 검색합니다.
  3. 셋째, ACL에 있는 개체의 ACE 또는 AES를 사용합니다.

신규 또는 수정된 ACL을 영구적으로 만들려면

  1. 먼저 ACL에 ACE를 추가합니다.
  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에서 API를 열거합니다.

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