可继承 ACE 的自动传播
SetNamedSecurityInfo 和 SetSecurityInfo 函数支持自动传播可继承的 访问控制项(ACE)。 例如,如果使用这些函数将可继承的 ACE 添加到 NTFS 中的目录,系统会将 ACE 应用于任何现有子目录或文件的 访问控制列表(ACL)。
直接应用的 ACE 优先于继承的 ACE。 通过将直接应用的 ACE 置于 自由访问控制列表(DACL)中,系统实现此优先顺序。 调用 SetNamedSecurityInfo 并 SetSecurityInfo 函数来设置对象的安全信息时,系统将当前继承模型强加于目标对象下层次结构中所有对象的 ACL。 对于已转换为当前继承模型的对象,在对象的 安全描述符 的控制字段中设置SE_DACL_AUTO_INHERITED位和SE_SACL_AUTO_INHERITED位。
生成反映当前继承模型的新安全描述符时,请注意不要更改安全描述符的语义。 因此,不允许和拒绝 ACE 永远不会相互移动。 如果需要此类移动(例如,将所有非加密的 ACE 放置在 ACL 的前面),则 ACL 将被标记为受保护,以防止语义更改。
将继承的 ACE 传播到子对象时,系统使用以下规则:
- 如果没有 DACL 的子对象继承 ACE,则结果是包含仅包含继承 ACE 的 DACL 的子对象。
- 如果具有空 DACL 的子对象继承 ACE,则结果是包含仅包含继承的 ACE 的 DACL 的子对象。
- 如果从父对象中删除可继承的 ACE,则自动继承将删除子对象继承的 ACE 的任何副本。
- 如果自动继承导致从子对象的 DACL 中删除所有 ACE,则子对象具有空的 DACL 而不是 DACL。
这些规则可能会产生意外的结果,即将没有 DACL 的对象转换为具有空 DACL 的对象。 没有 DACL 的对象允许完全访问,但具有空 DACL 的对象允许无访问权限。 作为这些规则如何创建空 DACL 的示例,假设向对象的树的根对象添加可继承的 ACE。 自动继承将可继承的 ACE 传播到树中的所有对象。 以无 DACL 开头的子对象现在具有具有继承的 ACE 的 DACL。 如果从根对象中删除可继承的 ACE,系统会自动将更改传播到子对象。 以无 DACL 开头的子对象(允许完全访问)现在具有空的 DACL(不允许访问)。
若要确保不带 DACL 的子对象不受可继承的 ACE 的影响,请将SE_DACL_PROTECTED标志设置为对象的安全描述符。
有关如何正确创建 DACL 的信息,请参阅 创建 DACL。