Чтение набора прав доступа элемента управления в ACL объекта
Используя ADSI, вы читаете разрешение на доступ ACE так же, как и любой другой ACE в ACL. Обратите внимание, что интерфейсы безопасности Win32 (API) также можно использовать для чтения ACL на объектах каталогов. Однако управление правами доступа использует свойства интерфейса IADsAccessControlEntry таким образом, чтобы предоставить и запретить права доступа.
- AccessMask должен содержать ADS_RIGHT_DS_CONTROL_ACCESS.
- значениефлаговравно ADS_FLAG_OBJECT_TYPE_PRESENT.
- ObjectType представляет собой строковую форму атрибута rightsGUID права управления доступом. Строковый формат GUID является тем же строковым форматом, что и функция библиотеки COM StringFromGUID2.
- AceType может быть ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, чтобы предоставить доверенному лицу право управлять доступом, или ADS_ACETYPE_ACCESS_DENIED_OBJECT, чтобы запретить доверенному лицу это право.
- доверенное лицо — это субъект безопасности; пользователь, группа, компьютер и т. д., к которым применяется ACE.
Используйте следующую процедуру для чтения ACE для объекта ADSI. Следующая процедура применяется к приложениям C и C++.
Чтение ACE для объекта ADSI
- Получите указатель интерфейса IADs на объект.
- Используйте метод IADs::Get, чтобы получить дескриптор безопасности объекта. Имя свойства, содержащего дескриптор безопасности, — nTSecurityDescriptor. Свойство будет возвращено в виде типа VARIANT, содержащего указатель IDispatch. Имейте в виду, что участник vt выступает в роли VT_DISPATCH. Вызовите метод QueryInterface для этого указателя IDispatch, чтобы получить интерфейс IADsSecurityDescriptor и затем использовать методы в этом интерфейсе для доступа к ACL в дескрипторе безопасности.
- Чтобы получить ACL, используйте метод IADsSecurityDescriptor::get_DiscretionaryAcl. Метод возвращает указатель IDispatch. Вызовите QueryInterface на этом указателе IDispatch, чтобы получить интерфейс IADsAccessControlList и использовать методы этого интерфейса для доступа к отдельным ACEs в ACL.
- Используйте метод IADsAccessControlList::get__NewEnum для перечисления ACEs. Метод возвращает указатель IUnknown. Вызовите QueryInterface на этот указатель IEnumVARIANT, чтобы получить интерфейсIEnumVARIANT.
- Используйте метод IEnumVARIANT::Next для перечисления ACEs в списке ACL. Свойство возвращается в виде VARIANT, содержащей указатель IDispatch. Будьте внимательны, что член vt — это VT_DISPATCH. Вызовите QueryInterface на этот указатель IDispatch, чтобы получить интерфейс IADsAccessControlEntry для чтения ACE.
- Вызовите метод IADsAccessControlEntry::get_AccessMask, чтобы получить AccessMask и убедитесь, что значение AccessMask для флага ADS_RIGHT_DS_CONTROL_ACCESS. Если он имеет этот флаг, ACE содержит право управления доступом.
- Вызовите метод IADsAccessControlEntry::get_Flags, чтобы получить флаг для типа объекта.
- Проверьте значение флагов для флага ADS_FLAG_OBJECT_TYPE_PRESENT. Если для Flags установлено значение ADS_FLAG_OBJECT_TYPE_PRESENT, вызовите метод IADsAccessControlEntry::get_ObjectType, чтобы получить строку, содержащую GUID права управления доступом, к которому применяется ACE.
- Вызовите метод IADsAccessControlEntry::get_AceType, чтобы получить тип ACE. Тип будет ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, чтобы предоставить доверенному лицу право доступа, или ADS_ACETYPE_ACCESS_DENIED_OBJECT, чтобы запретить право доступа к контролю.
- Вызовите метод IADsAccessControlEntry::get_Trustee, чтобы получить главный субъект безопасности; это пользователь, группа, компьютер и т. д., к которым применяется ACE.
- После завершения работы со строками ObjectType и Trustee используйте SysFreeString, чтобы освободить память для этих строк.
- После завершения работы с интерфейсами вызовите Release, чтобы уменьшить или освободить все ссылки на интерфейс.