【发布时间】:2013-10-31 11:51:14
【问题描述】:
我正在使用 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 中找到相应的用户或组。
有没有办法做到这一点?如果您需要更多信息,请告诉我。
最好的问候, 天空
【问题讨论】: