我正在使用Java 1.7 AclAttributeView类来获取文件的ACL。
我所看到的是,对于某些文件,对getAcl()的Java API调用(或者这可能是Windows正在做的)是为单个ACL返回多个AclEntry对象,其中第一个条目将具有权限,但没有标志,第二个条目没有权限,但是标志。
这导致的行为是当我用上面的ACL写回文件时,我得到两个ACL ...第一个授予父目录的完全权限,第二个授予所有子目录的权限说目录。因此,作为SYSTEM用户,我永远不会写任何超过2级的东西。
一些测试输出(忽略BANANA位,我在无聊时将其用作调试记录):
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,所有架构上都看到了这种行为。
在我上面的设计示例中,我能够创建一个看起来像这样的文件夹结构:
.. \ DIR1 \ subdir1
作为SYSTEM用户,dir1仅使用SYSTEM的完全权限创建dir1,并且没有权限传播到任何子文件/文件夹。然后,subdir1没有SYSTEM用户的权限(根据Windows,甚至没有AclEntry)。
还有其他人看到这个/能够解释这里发生了什么吗?
(注意:我在C:\以外的文件/文件夹上看到类似的“多个AclEntry”行为,如我的例子所示)
编辑小代码样本产生类似结果......
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());
}