我正在使用 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
(English) 但文件系统返回一个带有德语翻译的组名VORDEFINIERT
。如果两者都是,例如Builtin
,我可能会解析UserPrincipal
并找出distinguishedName
AD 对象应该是什么......但是,这种方法似乎不是很可靠。
我真的很想能够读取所有UserPrincipal
对象的 SID,以便我可以在 AD 中找到相应的用户或组。
有没有办法做到这一点?如果您需要更多信息,请告诉我。
最好的问候,天空