Создание или изменение списка ACL

Windows поддерживает набор функций, которые создают список управления доступом (ACL) или изменяют записи управления доступом (ACE) в существующем списке управления доступом.

Функция SetEntriesInAcl создает новый список ACL. SetEntriesInAcl может указать совершенно новый набор ACE для ACL или объединить одно или несколько новых ACE с ACE существующего ACL. Функция SetEntriesInAcl использует массив EXPLICIT_ACCESS структур для указания сведений о новых ACE. Каждая структура EXPLICIT_ACCESS содержит сведения, описывающие один ACE. Эти сведения включают права доступа, тип ACE, флаги, управляющие наследованием ACE, и структуру TRUSTEE , которая идентифицирует доверенного лица.

Добавление нового ACE в существующий список ACL

  1. Используйте функцию GetSecurityInfo или GetNamedSecurityInfo , чтобы получить существующие DACL или SACL из дескриптора безопасности объекта.
  2. Для каждого нового ACE вызовите функцию BuildExplicitAccessWithName , чтобы заполнить структуру EXPLICIT_ACCESS сведениями, описывающими ACE.
  3. Вызовите Метод SetEntriesInAcl, указав существующий список ACL и массив EXPLICIT_ACCESS структур для новых ACE. Функция SetEntriesInAcl выделяет и инициализирует список ACL и его ACE.
  4. Вызовите функцию SetSecurityInfo или SetNamedSecurityInfo , чтобы присоединить новый список управления доступом к дескриптору безопасности объекта.

Если вызывающий объект указывает существующий список управления доступом, SetEntriesInAcl объединяет новые сведения ACE с существующими ACE в списке управления доступом. Рассмотрим, например, случай, когда существующий список управления доступом предоставляет доступ указанному доверенному лицу, а структура EXPLICIT_ACCESS запрещает доступ к тому же доверенному лицу. В этом случае SetEntriesInAcl добавляет новый ACE с запретом в доступе для доверенного лица и удаляет или изменяет существующий ACE, разрешенный доступом для доверенного лица.

Пример кода, который объединяет новый ACE в существующий список управления доступом, см. в разделе Изменение списков управления доступом объекта в C++.