我正在使用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中找到相应的用户或组。
有办法做到这一点吗?如果您需要更多信息,请与我们联系。
祝你好运, 天空
答案 0 :(得分:3)
我继续研究这个问题并找到了解决方案:
在这种情况下(访问Windows共享),aclEntry.principal()
返回的对象实际上是类WindowsUserPrincipals.Group
或WindowsUserPrincipals.User
。 UserPrincipal
是由WindowsUserPrincipals.User
实施的界面。 WindowsUserPrincipals.Group
是WindowsUserPrincipals.User
的子类。
班级sun.nio.fs.WindowsUserPrincipals
不公开,因此无法直接访问。但我看到内部类WindowsUserPrincipals.User
包含我一直在寻找的SID。它位于名为sidString
的私人字段中。
所以我的解决方案是检查返回的UserPrincipal
是否为WindowsUserPrincipal
,如果是,请使用反射来读取字段sidString
的值。
它可以工作并且可以以可靠的方式编写,但是,它不是一个非常好的解决方案,因为我必须使用反射。但我找不到更简单的方法来访问或获取SID。
如果您知道更好的方法来阅读SID,请仍然回答这个问题。谢谢。