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 の列挙子オブジェクトを取得して ACE を列挙します。
IADsAccessControlList::RemoveAce

アクセス制御リスト (ACL) からアクセス制御エントリ (ACE) を削除します。

注釈

アクセス制御リスト (ACL) は ACE のコレクションであり、異なるクライアントに対して同じ ADSI オブジェクトに対してより具体的なアクセス制御を提供できます。 一般に、プロバイダーによって異なるアクセス制御が実装されるため、オブジェクトの動作はプロバイダーに固有です。 詳細については、プロバイダーのドキュメントを参照してください。 Microsoft プロバイダーの詳細については、「 ADSI システム プロバイダー」を参照してください。 現時点では、LDAP プロバイダーのみがアクセス制御をサポートしています。

オブジェクト ACE を操作する前に、最初にそれらが属する ACL を取得します。 ACL はセキュリティ記述子によって管理され、随意 ACL とシステム ACL のいずれかを使用できます。 詳細については、「 IADsSecurityDescriptor」を参照してください。

IADsAccessControlList インターフェイスのプロパティとメソッドを使用すると、ACE の取得と列挙、リストへの新しいエントリの追加、または既存のエントリの削除を行うことができます。

ADSI に対するアクセス制御を管理するには

  1. まず、 IADsSecurityDescriptor インターフェイスを実装するオブジェクトのセキュリティ記述子を取得します。
  2. 次に、セキュリティ記述子から ACL を取得します。
  3. 3 つ目は、ACL 内のオブジェクトの ACE (ACE) を操作することです。

新しい ACE または変更された ACE を永続的にするには

  1. まず、ACL に ACE を追加します。
  2. 次に、ACL をセキュリティ記述子に割り当てます。
  3. 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 から ACE を列挙します。

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