Java AclAttributeView为Windows

时间:2015-10-13 16:25:28

标签: java windows acl

我正在使用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());
}

0 个答案:

没有答案