IADsAccessControlList 接口 (iads.h)
IADsAccessControlList 接口是一个双重接口,用于管理各个访问控制项 (ACE) 。
继承
IADsAccessControlList 接口继承自 IDispatch 接口。 IADsAccessControlList 也包含以下类型的成员:
方法
IADsAccessControlList 接口包含以下方法。
IADsAccessControlList::AddAce IADsAccessControlList::AddAce 方法将 IADsAccessControlEntry 对象添加到 IADsAccessControlList 对象。 |
IADsAccessControlList::CopyAccessList IADsAccessControlList::CopyAccessList 方法将访问控制列表中的每个访问控制项 (ACE) 复制到调用方的进程空间 (ACL) 。 |
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。
- 第三,使用 ACL 中 对象的 ACE 或 ACE。
使任何新的或修改的 ACE 持久化
- 首先,将 ACE 添加到 ACL。
- 其次,将 ACL 分配给安全描述符。
- 第三,将安全描述符提交到目录存储。
示例
下面的代码示例演示如何使用任意 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 |