【发布时间】:2014-09-29 13:16:35
【问题描述】:
我使用 Java7 中的 AclFileAttributeView 来读取 Windows 目录的文件夹权限。问题是我无法获得完整的概述,因为 AclFileAttributeView 不返回通用权限,如 GENERIC_ALL、GENERIC_WRITE、GENERIC_READ 和 GENERIC_EXECUTE(访问掩码中的四个高位)。事实上,当涉及到通用权限时,它给了我关于同一成员的其他 AclEntries 的错误信息。举个例子吧:
当我使用 AccessChk 之类的工具列出系统帐户的 c:\windows 的 AclEntries 时,我得到以下信息:
[2] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
FILE_ADD_FILE
FILE_ADD_SUBDIRECTORY
FILE_LIST_DIRECTORY
FILE_READ_ATTRIBUTES
FILE_READ_EA
FILE_TRAVERSE
FILE_WRITE_ATTRIBUTES
FILE_WRITE_EA
DELETE
SYNCHRONIZE
READ_CONTROL
[3] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
[OBJECT_INHERIT_ACE]
[CONTAINER_INHERIT_ACE]
[INHERIT_ONLY_ACE]
GENERIC_ALL
如您所见,第一个 AclEntry 仅适用于文件夹本身,并且具有不特殊权限 WRITE_ACL 和 WRITE_OWNER。 第二个 AclEntry 仅适用于子文件夹和文件,并包含通用权限 GENERIC_ALL。这正是我在 Windows 资源管理器的“安全”选项卡中看到的。系统帐户的两条记录,一条仅适用于文件夹(具有部分权限),一条适用于具有完全控制权的子文件夹/文件。
现在我使用以下代码运行我的 java 程序:
AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class);
System.out.println(view.getAcl());
这为我的系统帐户提供了以下结果:
- NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW
- 新台币 AUTHORITY\SYSTEM:FILE_INHERIT/DIRECTORY_INHERIT/INHERIT_ONLY:ALLOW
第一个AclEntry只适用于文件夹本身,包含了所有的特殊权限,包括WRITE_ACL和WRITE_OWNER,这是不正确的!第二个 AclEntry 没有显示任何权限,因为它上面有 GENERIC_ALL!
我不确定这是哪里出错了,JRE 似乎只是解码了操作系统给出的 ACE 位掩码 (sun.nio.fs.WindowsSecurityDescriptor.decode)。
有人遇到过同样的问题吗?我会尝试一些其他的 JRE,也许会有所作为。
【问题讨论】:
-
关于 WRITE_ACL 的外观,Java 可能会插入它,因为对象的所有权隐含地为您提供了此权限。 WRITE_OWNER 也可能如此,我不确定。不知道为什么第二个 ACL 为空 - 除非该函数的目的是为您提供有关 该特定对象 的访问权限的信息,因此排除仅继承访问权限?
-
也许 JVM 的本机 C++ 部分正在执行一些额外的逻辑,但据我所知,它使用本机方法 WindowsNativeDispatcher.GetAce 来检索位掩码,然后调用 WindowsSecurityDescriptor.decode 其中这些位被转换为标志和权限。我认为这是导致问题的原因,此方法中未使用四个高位(用于通用权限)。所以我很害怕这只是在 JVM 中丢失,它应该(至少)将通用权限转换为特殊权限。也许有人知道读取 NTFS 权限的库?
标签: java windows permissions directory acl