【问题标题】:Map a Java UserPrincipal to an Active Directory user将 Java UserPrincipal 映射到 Active Directory 用户
【发布时间】:2013-10-31 11:51:14
【问题描述】:

我正在使用 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 中找到相应的用户或组。

有没有办法做到这一点?如果您需要更多信息,请告诉我。

最好的问候, 天空

【问题讨论】:

    标签: java jndi nio2


    【解决方案1】:

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

    在这种情况下(访问 Windows 共享)aclEntry.principal() 返回的对象实际上属于 WindowsUserPrincipals.GroupWindowsUserPrincipals.User 类。 UserPrincipalWindowsUserPrincipals.User 实现的接口。而WindowsUserPrincipals.GroupWindowsUserPrincipals.User 的子类。

    sun.nio.fs.WindowsUserPrincipals 类不是公开的,所以不能直接访问。但我看到内部类WindowsUserPrincipals.User 正好包含我一直在寻找的 SID。它位于名为 sidString 的私有字段中。

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

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

    如果您知道读取 SID 的更好方法,请仍然回答此问题。谢谢。

    【讨论】:

    • 嗨,天空!我正在研究实现与您所做的类似的方法,我想知道您的实现在 2 年后是否仍然存在?也许您找到了更可靠的方法来将 AD 用户/组与 AclFileAttributeView 中的用户/组匹配?
    • @VolodymyrKrupach 是的,它工作可靠,并且已经在生产环境中使用了大约 2 年,没有出现任何问题。看到它运作良好并且我没有得到任何进一步的意见,我没有进一步研究这个主题,因此没有找到任何其他方法来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多