Java AclAttributeView为Windows上的单个ACL返回多个AclEntry对象

我正在使用Java 1.7 AclAttributeView类来获取ACL的文件

我所看到的是,对于某些文件,Java API调用getAcl()(或者这也是Windows的做法)是为单个ACL返回多个AclEntry对象,其中第一个条目将具有权限,但不包含标志,第二个条目将没有权限,但标志。

这导致的行为是,当我用上面的ACL写回文件时,我得到两个ACL …第一个授予对父目录的完全权限,第二个授予对所述目录的所有子节点的权限。 因此,例如,作为SYstem用户,我永远不能写超过2级的任何东西。

一些testing输出(忽略BANANA位,当它用作debugging日志时,无聊):

在Linux上查询ACL

在win7中删除旧的Postgresql数据目录

如何从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的文件夹的列表

为什么为我的服务创build的文件设置(有时)只读属性

什么时候自托pipeAddressAccessDeniedException:HTTP无法注册URL

Windows NT ACL如何工作?

如何更改Windows中的文件ACL,如果我只知道SID?

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...