将Java UserPrincipal映射到Active Directory用户

时间:2013-10-22 14:31:47

标签: java jndi nio2

我正在使用Java访问远程服务器。服务器运行Microsoft Windows并提供Active Directory以及文件系统共享。我通过JNDI从Active Directory读取用户和组,效果很好。我获得了所有用户属性,例如distinguishedNameobjectSid等等。

我的Java程序还使用Java 7和NIO.2连接到同一服务器上的Windows共享。我可以读取远程文件系统并获取有关它的信息。我也可以读取这样的文件权限设置:

    import java.nio.file.Files;
    import java.nio.file.attribute.AclEntry;
    import java.nio.file.attribute.AclFileAttributeView;
    import java.nio.file.attribute.UserPrincipal;

    [...]

    AclFileAttributeView aclView = Files.getFileAttributeView(path, AclFileAttributeView.class);

    for (AclEntry aclEntry : aclView.getAcl()) {
        UserPrincipal principal = aclEntry.principal();
        [...]
    }

这样我获得了UserPrincipal对象的访问权限。此类仅提供方法getName(),该方法返回一些名称或有时返回SID。

对于实际用户,UserPrincipal对象返回一个SID,我可以用它来查找Active Directory中的相应用户。但是,如果UserPrincipal代表某个群组,getName()只会返回一个类似"VORDEFINIERT\Administratoren"的文字。

我找不到将此文本映射到Active Directory中定义的组的方法。 AD中的相应组具有此distinguishedName属性:CN=Administratoren,CN=Builtin,DC=mydomain,DC=com

运行Java程序的机器和服务器都运行德语版的Windows。很奇怪AD返回CN=Builtin(英语),但文件系统返回一个带有德语翻译VORDEFINIERT的组名。如果两者都是例如Builtin我可以解析UserPrincipal并找出AD对象的distinguishedName应该是什么......但是,这种方法似乎不太可靠。

我真的希望能够读取所有UserPrincipal个对象的SID,以便在AD中找到相应的用户或组。

有办法做到这一点吗?如果您需要更多信息,请与我们联系。

祝你好运, 天空

1 个答案:

答案 0 :(得分:3)

我继续研究这个问题并找到了解决方案:

在这种情况下(访问Windows共享),aclEntry.principal()返回的对象实际上是类WindowsUserPrincipals.GroupWindowsUserPrincipals.UserUserPrincipal是由WindowsUserPrincipals.User实施的界面。 WindowsUserPrincipals.GroupWindowsUserPrincipals.User的子类。

班级sun.nio.fs.WindowsUserPrincipals不公开,因此无法直接访问。但我看到内部类WindowsUserPrincipals.User包含我一直在寻找的SID。它位于名为sidString的私人字段中。

所以我的解决方案是检查返回的UserPrincipal是否为WindowsUserPrincipal,如果是,请使用反射来读取字段sidString的值。

它可以工作并且可以以可靠的方式编写,但是,它不是一个非常好的解决方案,因为我必须使用反射。但我找不到更简单的方法来访问或获取SID。

如果您知道更好的方法来阅读SID,请仍然回答这个问题。谢谢。