我正在使用 Java 访问远程服务器。服务器运行 Microsoft Windows 并提供 Active Directory 和文件系统共享。我通过 JNDI 从 Active Directory 读取用户和组,效果很好。我获得了所有用户属性,例如 distinguishedName
、objectSid
等等。
我的 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.Group
或 WindowsUserPrincipals.User
。 UserPrincipal
是由WindowsUserPrincipals.User
实现的接口(interface)。 WindowsUserPrincipals.Group
是 WindowsUserPrincipals.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/