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


Чтение набора прав доступа элемента управления в ACL объекта

Используя ADSI, вы считываете право управления доступом aCE так же, как и любой другой ACE в ACL. Обратите внимание, что api безопасности Win32 также можно использовать для чтения списков управления доступом к объектам каталогов. Однако права управления доступом используют свойства интерфейса 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. Вызовите запросInterface на этот указатель IDispatch, чтобы получить интерфейс IADsSecurityDescriptor, чтобы использовать методы в этом интерфейсе для доступа к ACL дескриптора безопасности.
  3. Используйте метод IADsSecurityDescriptor::get_DiscretionaryAcl, чтобы получить ACL. Метод возвращает указатель IDispatch. Вызовите указатель QueryInterface на этот указатель IDispatch, чтобы получить интерфейс IADsAccessControlList, чтобы использовать методы в этом интерфейсе для доступа к отдельным acEs в ACL.
  4. Используйте метод IADsAccessControlList::get__NewEnum для перечисления acEs. Метод возвращает указатель IUnknown. Вызовите queryInterface на этот указатель IUnknown, чтобы получить интерфейс IEnumVARIANT.
  5. Используйте метод IEnumVARIANT::Next для перечисления acEs в ACL. Свойство возвращается как VARIANT, содержащий указатель IDispatch. Помните, что член vt VT_DISPATCH. Вызовите запросInterface на этот указатель 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. Если для флагов задано значение ADS_FLAG_OBJECT_TYPE_PRESENT, вызовите метод IADsAccessControlEntry::get_ObjectType , чтобы получить строку, содержащую rightsGUID права управления доступом, к которому применяется ACE.
  9. Вызовите метод IADsAccessControlEntry::get_AceType, чтобы получить тип ACE. Тип будет ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, чтобы предоставить доверенному лицу право на доступ к контролю или ADS_ACETYPE_ACCESS_DENIED_OBJECT запретить право доступа к контролю.
  10. Вызовите метод IADsAccessControlEntry::get_Trustee, чтобы получить субъект безопасности; то есть пользователь, группа, компьютер и т. д., к которому применяется ACE.
  11. После завершения работы со строками ObjectType и Доверенного лица используйте SysFreeString, чтобы освободить память для этих строк.
  12. Завершив работу с интерфейсами, вызовите release для уменьшения или выпуска всех ссылок на интерфейс.