4

我正在使用 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(English) 但文件系统返回一个带有德语翻译的组名VORDEFINIERT。如果两者都是,例如Builtin,我可能会解析UserPrincipal并找出distinguishedNameAD 对象应该是什么......但是,这种方法似乎不是很可靠。

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

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

最好的问候,天空

4

1 回答 1

3

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

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

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

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

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

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

于 2013-10-22T16:42:27.637 回答