从Java读取Windows ACL

从Java程序中,我希望能够列出有权读取给定文件的Windows用户和组。 Java没有内置的读取Windows ACL信息的能力(至less在Java 7之前 ),所以我正在寻找其他解决scheme。

是否有任何第三方库可用于直接访问Windows文件的ACL信息?

如果不这样做,也许运行cacls和捕获,然后处理输出将是一个合理的临时解决scheme – cacls的输出格式是否在任何地方彻底logging,是否可能会改变之间的Windows版本?

Solutions Collecting From Web of "从Java读取Windows ACL"

如果您知道Windows API,则可以使用JNA (JNI,无需编写本机代码)来调用Windows API来获取ACL数据。

此处可以看到一篇文章 ,它使用VBScript获取文件安全细节。 你可以修改它,并让它以可解析的格式(例如XML)返回细节。 您可以使用Runtime.exec()或ProcessBuilder运行“cscript.exe”来调用VBScript文件。 您可以将ACL信息写入标准输出,并使用java.lang.Process上的可用流读取过程输出。

尽管执行vbscript可能看起来有点冒险,但它会让你快速开始,因为大部分的代码已经被编写和运行(我假设 – 我没有尝试过这篇文章中的脚本)。也避免了需要通过JNA将相关的Win32 apis映射到java。

mdma的答案涵盖了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"); }