可继承 ACE 的自动传播
SetNamedSecurityInfo 和 SetSecurityInfo 函数支持自动传播可继承的访问控制项 (ACE) 。 例如,如果使用这些函数将可继承的 ACE 添加到 NTFS 中的目录,则系统会将 ACE 应用于访问控制 列表 , (ACL) 任何现有子目录或文件。
直接应用的 ACE 优先于继承的 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。