从Java读取Windows ACL

Mat*_*ard 3 java windows security acl

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

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

如果失败了,可能运行cacls并捕获然后处理输出将是一个合理的临时解决方案 - cacls的输出格式是否在任何地方都有详细记录,并且它可能在Windows版本之间发生变化吗?

mdm*_*dma 5

如果你知道windows API,你可以使用JNA(没有编写本机代码的麻烦的JNI)来调用Windows API来获取ACL数据.

这里有一篇文章,它使用VBScript获取文件安全性详细信息.您可以修改它,并让它以可解析的格式(例如XML)返回详细信息.您可以使用Runtime.exec()或ProcessBuilder运行"cscript.exe"来调用VBScript文件.您可以将ACL信息写入标准输出,并使用可用的流java.lang.Process来读取过程输出.

虽然exec'ing vbscript可能看起来有点hacky,但它会让你快速启动,因为大部分代码已经编写并正常工作(我认为 - 我没有尝试过本文中的脚本.)使用脚本也避免了需要通过JNA将相关的Win32 apis映射到java.


Luk*_*ane 5

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");
}
Run Code Online (Sandbox Code Playgroud)