Интерфейс 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 Удаляет запись управления доступом (ACE) из списка управления доступом (ACL). |
Комментарии
Список управления доступом (ACL) — это коллекция ACE, которая может предоставлять более точное управление доступом к одному и тому же объекту ADSI для разных клиентов. Как правило, разные поставщики реализуют различные элементы управления доступом, поэтому поведение объекта зависит от поставщика. Дополнительные сведения см. в документации по поставщику. Дополнительные сведения о поставщиках Майкрософт см. в разделе Поставщики системы ADSI. В настоящее время только поставщик LDAP поддерживает элементы управления доступом.
Прежде чем работать с ACE объекта, сначала получите список ACL, к которому они принадлежат. Списки управления доступом управляются дескрипторами безопасности и могут иметь как дискреционный список ACL, так и системный ACL. Дополнительные сведения см. в разделе IADsSecurityDescriptor.
С помощью свойств и методов интерфейса IADsAccessControlList можно получать и перечислять ACE, добавлять новые записи в список или удалять существующие.
Управление элементами управления доступом через ADSI
- Сначала получите дескриптор безопасности объекта, реализующего интерфейс IADsSecurityDescriptor .
- Во-вторых, получите список управления доступом из дескриптора безопасности.
- В-третьих, работайте с ACE или ACE объекта в списке ACL.
Создание постоянных новых или измененных 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
В следующем примере кода перечисляются ACE из DACL.
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 |
Header | iads.h |