我有以下场景,其中我(admin
)对已经从父文件夹继承了修改权限的(DE,W)
以下文件夹应用了拒绝权限:test_folder
test_user
B:\>icacls test_folder
test_folder test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
B:\>icacls test_folder /deny test_user:(DE,W)
B:\>icacls test_folder
test_folder test_user:(DENY)(W,D)
test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
我期望的最终结果是test_user
能够具有读取/执行访问权限, test_folder
但不能删除/重命名该文件夹以及向其中添加文件夹/文件。
但结果是根本test_folder
看不到。我仍然可以看到 ( )。test_user
test_folder
admin
然而我否认的DE
是:
B:\>icacls test_folder
test_folder test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
B:\>icacls test_folder /deny test_user:(DE)
B:\>icacls test_folder
test_folder test_user:(DENY)(D)
test_user:(I)(OI)(CI)(M)
admin:(I)(OI)(CI)(M)
test_user
能够看到test_folder
。因此某种程度上W
造成了问题。
知道为什么会发生这种情况吗?
答案1
和(W)
都是(M)
宏;它们扩展为多个实际访问标志。
尤其(W)
是像文件_通用_写入授予以下权利:
- “同步”
(S)
- “写入数据”
(WD)
- “附加数据”
(AD)
- “编写 EA”
(WEA)
- “写入属性”
(WA)
“同步”权限相当模糊(甚至没有在 GUI 中显示),但它对于几乎任何类型的文件访问都是必需的——读取和写入都需要它。和写作,因此包括在“(R)” 和 “(W)”套。
因此,当您拒绝(W)访问时,您最终也会拒绝“同步”权限,而这是许多程序对文件进行操作所必需的。
微软的文件访问文档还注意到这一点:
请注意,您不能使用拒绝访问的 ACE 来仅拒绝对文件的 GENERIC_READ 或 GENERIC_WRITE 访问。这是因为对于文件对象,GENERIC_READ 或 GENERIC_WRITE 的通用映射都包含 SYNCHRONIZE 访问权限。如果 ACE 拒绝受托者的 GENERIC_WRITE 访问权限,而受托者请求 GENERIC_READ 访问权限,则请求将失败,因为请求隐式包含 SYNCHRONIZE 访问权限,而 ACE 隐式拒绝该访问权限,反之亦然。不要使用拒绝访问的 ACE,而应使用允许访问的 ACE 来明确允许允许的访问权限。
如果必须使用“拒绝”ACE,则需要单独拒绝 (W) 包含的其他四个权限,即(WD,AD,WEA,WA)
,但请注意,这样的 ACE 往往会使 ACL 编辑工具有些困惑。(许多工具仍会将其折叠为通用的“写入”,您将无法分辨出区别。)
较旧的cacls
工具在这里特别有用,因为它不了解许多新的宏/别名,因此向您显示了所有单独的访问权限。或者,PowerShell 的Get-Acl
粒度通常太细以至于无法使用,但在这种情况下,它的粒度刚好足够有用:
PS C:\> icacls 测试 /grant “用户:(OI)(CI)(右,左)“ PS C:\> icacls 测试 /deny “用户:(OI)(CI)(女)“ PS C:\> Get-Acl 测试| fl 使用权 :FOO\user 拒绝写入,同步 NT AUTHORITY\SYSTEM 允许完全控制 BUILTIN\Administrators 允许完全控制 FOO\user 允许读取和执行,同步 PS C:\> cacls 测试 C:\test FOO\user (OI)(CI)(DENY)(特殊访问:) 同步 文件写入数据 文件附加数据 文件写入_EA 文件写入属性 FOO\user:(OI)(CI)(DENY)(特殊访问:) 删除 同步 BUILTIN\管理员:(OI)(CI)F NT 权限\系统:(OI)(CI)F