在Java程序中,我希望能够列出有权读取给定文件的Windows用户和组。 Java没有内置的能力来读取Windows ACL信息(至少在Java 7之前),所以我正在寻找其他解决方案。
是否有可用的第三方库可以直接访问Windows文件的ACL信息?
如果失败了,可能运行cacls并捕获然后处理输出将是一个合理的临时解决方案 - cacls的输出格式是否在任何地方都有详细记录,是否可能在Windows版本之间进行更改?
答案 0 :(得分:5)
如果你知道windows API,你可以使用JNA(没有编写本机代码的麻烦的JNI)来调用Windows API来获取ACL数据。
这里有an article,它使用VBScript获取文件安全性详细信息。您可以修改它,并让它以可解析的格式(例如XML)返回详细信息。您可以使用Runtime.exec()或ProcessBuilder运行“cscript.exe”来调用VBScript文件。您可以将ACL信息写入标准输出,并使用java.lang.Process
上可用的流来读取过程输出。
尽管exec'ing vbscript可能看起来有点hacky,但它会让你快速启动,因为大部分代码已经编写并正常工作(我认为 - 我没有在文章中尝试过该脚本。)使用该脚本还可以避免需要通过JNA将相关的Win32 api映射到java。
答案 1 :(得分:5)
mdma的answer涵盖了Java 6的最佳方法,但这里是Java 7的一个简单示例:
Path file = Paths.get("c:\\test-file.dat");
AclFileAttributeView aclFileAttributes = Files.getFileAttributeView(
file, AclFileAttributeView.class);
for (AclEntry aclEntry : aclFileAttributes.getAcl()) {
System.out.println(aclEntry.principal() + ":");
System.out.println(aclEntry.permissions() + "\n");
}