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 に対するアクセス制御を管理するには
- まず、 IADsSecurityDescriptor インターフェイスを実装するオブジェクトのセキュリティ記述子を取得します。
- 次に、セキュリティ記述子から ACL を取得します。
- 3 つ目は、ACL 内のオブジェクトの ACE (ACE) を操作することです。
新しい ACE または変更された ACE を永続的にするには
- まず、ACL に ACE を追加します。
- 次に、ACL をセキュリティ記述子に割り当てます。
- 3 つ目は、セキュリティ記述子をディレクトリ ストアにコミットすることです。
例
次のコード例は、随意 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 |