我正在使用Java 1.7 AclAttributeView类来获取ACL的文件。
我所看到的是,对于某些文件,Java API调用getAcl()(或者这也是Windows的做法)是为单个ACL返回多个AclEntry对象,其中第一个条目将具有权限,但不包含标志,第二个条目将没有权限,但标志。
这导致的行为是,当我用上面的ACL写回文件时,我得到两个ACL …第一个授予对父目录的完全权限,第二个授予对所述目录的所有子节点的权限。 因此,例如,作为SYstem用户,我永远不能写超过2级的任何东西。
一些testing输出(忽略BANANA位,当它用作debugging日志时,无聊):
在Linux上查询ACL
如何从C#中的打印机中删除访问控制条目?
MSDN示例中SetEntriesInAcl错误87的原因
尽pipe有相关的SACL,但没有产生审计事件
BANANA :: getMetadata; file=C: BANANA :: fromAclEntry()... acl: BANANA :: user=BUILTINAdministrators BANANA :: perm=[WRITE_ACL,DELETE_CHILD,APPEND_DATA,WRITE_DATA,WRITE_NAMED_ATTRS,READ_ACL,READ_ATTRIBUTES,WRITE_ATTRIBUTES,EXECUTE,DELETE,... 4 more] BANANA :: flag=[] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=BUILTINAdministrators BANANA :: perm=[] BANANA :: flag=[INHERIT_ONLY,FILE_INHERIT,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=NT AUTHORITYSYstem BANANA :: perm=[WRITE_ACL,... 4 more] BANANA :: flag=[] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=NT AUTHORITYSYstem BANANA :: perm=[] BANANA :: flag=[INHERIT_ONLY,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=BUILTINUsers BANANA :: perm=[READ_ATTRIBUTES,SYNCHRONIZE,READ_DATA,READ_NAMED_ATTRS] BANANA :: flag=[FILE_INHERIT,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=NT AUTHORITYAuthenticated Users BANANA :: perm=[DELETE] BANANA :: flag=[INHERIT_ONLY,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=NT AUTHORITYAuthenticated Users BANANA :: perm=[APPEND_DATA] BANANA :: flag=[] BANANA :: type=ALLOW
我在所有体系结构的Windows 7,8和10上看到了这种行为。
在我上面的例子中,我可以创build一个如下所示的文件夹结构:
.. DIR1 subdir1
作为SYstem用户,dir1获取具有完全权限SYstem只dir1创build,没有权限传播到任何子文件/文件夹。 subdir1然后没有SYstem用户的权限(根据Windows,甚至没有AclEntry)。
有没有人看到这个/能够解释这里发生了什么?
(注意:我看到类似的“多个AclEntry”行为在C:以外的文件/文件夹中,如我的示例所示)
编辑小代码示例产生类似的结果…
final AclFileAttributeView aclView = Files.getFileAttributeView(file.toPath(),AclFileAttributeView.class); List<AclEntry> acls = aclView.getAcl(); for (AclEntry acl : acls) { System.out.println("user=" + acl.principal().getName()); System.out.println("perm=" + acl.permissions()); System.out.println("flag=" + acl.flags()); System.out.println("type=" + acl.type().name()); }
具有IdentityReference:BUILTIN Users的文件夹的列表
什么时候自托pipeAddressAccessDeniedException:HTTP无法注册URL
Windows NT ACL如何工作?
如何更改Windows中的文件ACL,如果我只知道SID?