Автоматическое распространение наследуемых ACE

Функции SetNamedSecurityInfo и SetSecurityInfo поддерживают автоматическое распространение наследуемых записей управления доступом (ACE). Например, если эти функции используются для добавления наследуемого ACE в каталог NTFS, система применяет ACE соответствующим образом к спискам управления доступом (ACL) всех существующих подкаталогов или файлов.

Непосредственно примененные ACE имеют приоритет над наследуемымИ ACE. Система реализует этот приоритет, помещая непосредственно примененные ACE перед унаследованными ACE в списке управления доступом на уровне пользователей (DACL). При вызове функций SetNamedSecurityInfo и SetSecurityInfo для задания сведений о безопасности объекта система накладывает текущую модель наследования на списки управления доступом всех объектов в иерархии под целевым объектом. Для объектов, преобразованных в текущую модель наследования, SE_DACL_AUTO_INHERITED и SE_SACL_AUTO_INHERITED биты задаются в поле элемента управления дескриптора безопасности объекта .

При создании нового дескриптора безопасности, который отражает текущую модель наследования, необходимо не изменять семантику дескриптора безопасности. Таким образом, разрешать и запрещать ACE никогда не перемещаются по отношению друг к другу. Если такое перемещение необходимо (например, для размещения всех ненаследованных ACE в передней части ACL), ACL помечается как защищенный, чтобы предотвратить семантические изменения.

При распространении унаследованных ACE на дочерние объекты система использует следующие правила:

  • Если дочерний объект без DACL наследует ACE, результатом будет дочерний объект с DACL, который содержит только унаследованный ACE.
  • Если дочерний объект с пустым DACL наследует ACE, результатом будет дочерний объект с DACL, который содержит только унаследованный ACE.
  • При удалении наследуемого ACE из родительского объекта автоматическое наследование удаляет все копии ACE, унаследованные дочерними объектами.
  • Если автоматическое наследование приводит к удалению всех ACE из СПИСКА DACL дочернего объекта, то дочерний объект имеет пустой DACL, а не daCL.

Эти правила могут иметь непредвиденный результат преобразования объекта без DACL в объект с пустым DACL. Объект без DACL разрешает полный доступ, а объект с пустым DACL не разрешает доступ. В качестве примера того, как эти правила могут создать пустой DACL, предположим, что вы добавляете наследуемый ACE в корневой объект дерева объектов . Автоматическое наследование распространяет наследуемый ACE на все объекты в дереве. Дочерние объекты, которые запускались без DACL, теперь имеют DACL с унаследованным ACE. При удалении наследуемого ACE из корневого объекта система автоматически распространяет изменения на дочерние объекты. Дочерние объекты, которые запускались без DACL (с разрешением полного доступа), теперь имеют пустой DACL (без доступа).

Чтобы дочерний объект без DACL не влиял на наследуемые ACE, установите флаг SE_DACL_PROTECTED в дескрипторе безопасности объекта.

Сведения о том, как правильно создать DACL, см. в разделе Создание DACL.