java - 将 Java UserPrincipal 映射到 Active Directory 用户

标签 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 中找到相应的用户或组。

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

最好的问候, 天空

最佳答案

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

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

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

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

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

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

关于java - 将 Java UserPrincipal 映射到 Active Directory 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19520758/

相关文章:

java - 字节数组到图像对象

java - 我在这里滥用日志级别的想法吗?

java - 将输入日期字符串转换为 SQL 日期类型

java - JNDI @Resource 注释

java - 如何在 Java 7 中用 nio 替换 File.listFiles(FileFilter filter)?

java - 为什么 Java NIO.2 中的异步 channel 需要这些暂停?

java - 为什么我们可以在Java中更改只读文件的文件属性?

java - 数组有问题,无法向他添加任何内容

.net - 如何根据 objectGUID 获取 AD 用户的 'memberof' 属性值?

java - 使用CDI动态加载Bean - EJB3