我有一个这样的目录结构:
目录 1 -> 目录 2 -> 目录 3 -> 目录 4
dir2 在目录 dir1 内,dir3 在目录 dir2 内等。
'dir1' 有自己的一组 DACL。它们是明确的。在 'dir1' - (OI) 和 (CI) 的 DACL 上启用了继承。以同样的方式在目录 dir2、dir3 和 dir4 上启用继承。
最初 dir2、dir3 和 dir4 有自己的一组 DACL,它们是显式的。没有一个 DACL 是继承的,但它们是可继承的。
例如,每个目录 dir1、dir2、dir3 和 dir4 都有 DACL 'Allow Full control to use SYSTEM' 并从 GUI 中显示 None 的列继承。
我有一个函数 setAcl(char* path)。此函数执行以下操作:
为管理员组调用 AllocateAndInitializeSid。
- 创建 ACL 并调用 InitializeAcl
- 调用 AddAccessAllowedAce。此 ACE 不可继承。
- 在传递的参数“路径”上调用 SetNamedSecurityInfo。这些标志被传递:DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION。
在上述目录中调用 setAcl(),顺序如下:
- 目录3
- 目录2
- 目录4
当它第一次在目录 'dir3' 上调用时,它会为管理员组添加一个显式的 DACL(由于 setAcl 函数而添加)。此外,由于未设置标志 PROTECTED_DACL_SECURITY_INFORMATION,它还会添加来自父级的可继承的 DACL。所以现在 dir3 目录有一个显式 DACL 和另一个从父文件夹“dir2”继承的“允许完全控制系统”DACL。最初,它具有所有显式 DACL。
当在目录 'dir2' 上调用 setAcl 时,也会发生同样的事情。它为管理员组添加了一个显式 DACL,并从父文件夹继承了其他 DACL。“允许完全控制系统”现在标记为从目录“dir1”继承。由于 SetNamedSecurityInfo 还更新了子对象 DACL,它更新了目录“dir3”(dir2 的子对象)的 DACL。由于现在 'dir2' 没有明确的 DACL 'allow Full control to System',所以 dir3 的这个 DAC1 是从目录 'dir1' 继承的,而在函数调用之前它是从目录 'dir2' 继承的。
我认为继承规则在这里出现,首先一个对象从父级继承 DACL。如果没有一个是可继承的,它会从祖父母那里继承。我对么?
到目前为止,我可以理解一切,当我调用 setAcl("dir4") 时问题就开始了。在 setAcl("dir4") 之后,'dir4' 目录只有一个显式 DACL。它没有从它的祖父母那里继承任何东西。
为什么当我调用“SetNamedSecurityInfo”时它没有从其祖父母那里继承权限?
我的期望是,在调用 SetNamedSecurityInfo 之后,它应该从目录 'dir1' 合并可继承的 DACL,就像我调用 setAcl("dir3") 时所做的那样。但它不会发生。你能解释一下为什么吗?