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 列舉值物件以列舉 ACL。 |
IADsAccessControlList::RemoveAce 從訪問控制清單 (ACE) 移除存取控制專案, (ACL) 。 |
備註
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 |