Поделиться через


Чтение набора прав доступа элемента управления в 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

  1. Получите указатель интерфейса IADs на объект.
  2. Используйте метод IADs::Get, чтобы получить дескриптор безопасности объекта. Имя свойства, содержащего дескриптор безопасности, — nTSecurityDescriptor. Свойство будет возвращено в виде типа VARIANT, содержащего указатель IDispatch. Имейте в виду, что участник vt выступает в роли VT_DISPATCH. Вызовите метод QueryInterface для этого указателя IDispatch, чтобы получить интерфейс IADsSecurityDescriptor и затем использовать методы в этом интерфейсе для доступа к ACL в дескрипторе безопасности.
  3. Чтобы получить ACL, используйте метод IADsSecurityDescriptor::get_DiscretionaryAcl. Метод возвращает указатель IDispatch. Вызовите QueryInterface на этом указателе IDispatch, чтобы получить интерфейс IADsAccessControlList и использовать методы этого интерфейса для доступа к отдельным ACEs в ACL.
  4. Используйте метод IADsAccessControlList::get__NewEnum для перечисления ACEs. Метод возвращает указатель IUnknown. Вызовите QueryInterface на этот указатель IEnumVARIANT, чтобы получить интерфейсIEnumVARIANT.
  5. Используйте метод IEnumVARIANT::Next для перечисления ACEs в списке ACL. Свойство возвращается в виде VARIANT, содержащей указатель IDispatch. Будьте внимательны, что член vt — это VT_DISPATCH. Вызовите QueryInterface на этот указатель IDispatch, чтобы получить интерфейс IADsAccessControlEntry для чтения ACE.
  6. Вызовите метод IADsAccessControlEntry::get_AccessMask, чтобы получить AccessMask и убедитесь, что значение AccessMask для флага ADS_RIGHT_DS_CONTROL_ACCESS. Если он имеет этот флаг, ACE содержит право управления доступом.
  7. Вызовите метод IADsAccessControlEntry::get_Flags, чтобы получить флаг для типа объекта.
  8. Проверьте значение флагов для флага ADS_FLAG_OBJECT_TYPE_PRESENT. Если для Flags установлено значение ADS_FLAG_OBJECT_TYPE_PRESENT, вызовите метод IADsAccessControlEntry::get_ObjectType, чтобы получить строку, содержащую GUID права управления доступом, к которому применяется ACE.
  9. Вызовите метод IADsAccessControlEntry::get_AceType, чтобы получить тип ACE. Тип будет ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, чтобы предоставить доверенному лицу право доступа, или ADS_ACETYPE_ACCESS_DENIED_OBJECT, чтобы запретить право доступа к контролю.
  10. Вызовите метод IADsAccessControlEntry::get_Trustee, чтобы получить главный субъект безопасности; это пользователь, группа, компьютер и т. д., к которым применяется ACE.
  11. После завершения работы со строками ObjectType и Trustee используйте SysFreeString, чтобы освободить память для этих строк.
  12. После завершения работы с интерфейсами вызовите Release, чтобы уменьшить или освободить все ссылки на интерфейс.