Создание или изменение ACL
Windows поддерживает набор функций, которые создают список управления доступом (ACL) или изменяют записи управления доступом (ACEs) в существующем списке ACL.
Функция SetEntriesInAclсоздает новый ACL. SetEntriesInAcl может указать совершенно новый набор ACEs для ACL или объединить один или несколько новых ACEs с ACEs существующего ACL. Функция SetEntriesInAcl использует массив структур EXPLICIT_ACCESS для указания сведений о новых ACEs. Каждая структура EXPLICIT_ACCESS содержит информацию, описывающую одно ACE. Эти сведения включают права доступа, тип ACE, флаги, управляющие наследованием ACE, а также структуру доверенного лица, идентифицирующую доверенного лица.
Чтобы добавить новый ACE в существующую ACL
- Используйте функцию GetSecurityInfo или GetNamedSecurityInfo для получения существующей функции DACL или SACL из дескриптора безопасностиобъекта.
- Для каждого нового ACE вызовите функцию BuildExplicitAccessWithName, чтобы заполнить структуру EXPLICIT_ACCESS сведениями, описывающими ACE.
- Вызов SetEntriesInAcl, указав существующий ACL и массив структур EXPLICIT_ACCESS для новых ЭЛЭ. Функция SetEntriesInAcl выделяет и инициализирует ACL и её ACEs.
- Вызовите функцию SetSecurityInfo или SetNamedSecurityInfo, чтобы подключить новый ACL к дескриптору безопасности объекта.
Если вызывающий объект указывает существующий ACL, SetEntriesInAcl объединяет новую информацию ACE с существующими ACE в ACL. Рассмотрим случай, например, когда существующий ACL предоставляет доступ к указанному доверенному лицу, а структура EXPLICIT_ACCESS запрещает доступ к тому же доверенному лицу. В этом случае SetEntriesInAcl добавляет новый ACE отказа в доступе для доверенного лица и удаляет или изменяет существующий ACE с разрешением доступа для доверенного лица.
Пример кода, объединяющий новый ACE с существующим ACL, смотрите в разделе изменения списков ACL объекта в C++.