我正在使用Java 1.7 AclAttributeView类来获取ACL的文件。
我所看到的是,对于某些文件,Java API调用getAcl()(或者这也是Windows的做法)是为单个ACL返回多个AclEntry对象,其中第一个条目将具有权限,但不包含标志,第二个条目将没有权限,但标志。
这导致的行为是,当我用上面的ACL写回文件时,我得到两个ACL …第一个授予对父目录的完全权限,第二个授予对所述目录的所有子节点的权限。 因此,例如,作为SYSTEM用户,我永远不能写超过2级的任何东西。
一些testing输出(忽略BANANA位,当它用作debugging日志时,无聊):
BANANA :: getMetadata; file=C:\ BANANA :: fromAclEntry()... acl: BANANA :: user=BUILTIN\Administrators 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=BUILTIN\Administrators BANANA :: perm=[] BANANA :: flag=[INHERIT_ONLY,FILE_INHERIT,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=NT AUTHORITY\SYSTEM 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=NT AUTHORITY\SYSTEM BANANA :: perm=[] BANANA :: flag=[INHERIT_ONLY,FILE_INHERIT,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=BUILTIN\Users BANANA :: perm=[READ_ATTRIBUTES,EXECUTE,SYNCHRONIZE,READ_DATA,READ_ACL,READ_NAMED_ATTRS] BANANA :: flag=[FILE_INHERIT,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=NT AUTHORITY\Authenticated Users BANANA :: perm=[DELETE] BANANA :: flag=[INHERIT_ONLY,FILE_INHERIT,DIRECTORY_INHERIT] BANANA :: type=ALLOW BANANA :: fromAclEntry()... acl: BANANA :: user=NT AUTHORITY\Authenticated 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()); }