Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java UserPrincipal映射到Active Directory用户_Java_Jndi_Nio2 - Fatal编程技术网

将Java UserPrincipal映射到Active Directory用户

将Java UserPrincipal映射到Active Directory用户,java,jndi,nio2,Java,Jndi,Nio2,我正在用Java访问远程服务器。服务器运行Microsoft Windows并提供Active Directory和文件系统共享。我通过JNDI从Active Directory读取用户和组,这非常有效。我获得了所有用户属性,比如discrimitedName,objectSid等等 我的Java程序还使用Java7和NIO.2连接到同一服务器上的Windows共享。我可以读取远程文件系统并获取有关它的信息。我还可以读取如下文件权限设置: import java.nio.file.Fil

我正在用Java访问远程服务器。服务器运行Microsoft Windows并提供Active Directory和文件系统共享。我通过JNDI从Active Directory读取用户和组,这非常有效。我获得了所有用户属性,比如
discrimitedName
objectSid
等等

我的Java程序还使用Java7和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()
只返回一个文本,例如
“vorfineiert\Administratoren”

我找不到将此文本映射到Active Directory中定义的组的方法。AD中的相应组具有以下属性:
distrignizedName
:CN=Administratoren,CN=Builtin,DC=mydomain,DC=com

运行Java程序的机器和服务器都运行德语版本的Windows。奇怪的是,AD返回
CN=Builtin
(英语),但文件系统返回的组名带有德语翻译
vordiniert
。如果两者都是,例如,
Builtin
,我可能会解析
UserPrincipal
,并找出AD对象的
区分名称应该是什么。。。然而,这种方法似乎并不十分可靠

我非常希望能够读取所有
UserPrincipal
对象的SID,以便在AD中找到相应的用户或组

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

致以最良好的祝愿,
天空

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

在这种情况下(访问Windows共享),
acentry.principal()
返回的对象实际上属于类
WindowsUserPrincipals.Group
WindowsUserPrincipals.User
UserPrincipal
是由
WindowsUserPrinciples.User
实现的接口。和
WindowsUserPrinciples.Group
WindowsUserPrinciples.User
的子类

sun.nio.fs.WindowsUserPrinciples
不是公共的,因此无法直接访问。但是我看到内部类
WindowsUserPrinciples.User
正好包含我一直在寻找的SID。它位于名为
sidString
的私有字段中

因此,我的解决方案是检查返回的
UserPrincipal
是否是
WindowsUserPrincipal
,如果是,则使用反射读取字段
sidString
的值

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


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

你好,天空!我正在研究实现类似于您所做的事情的方法,我想知道您的实现在两年后是否仍然有效?也许您找到了更可靠的方法来将广告用户/组与AclFileAttributeView中的用户/组进行匹配?@VolodymyrKrupach是的,它工作可靠,并且已经在生产环境中使用了大约2年,没有任何问题。看到它工作得很好,我没有得到任何进一步的意见,我没有进一步研究这个话题,因此也没有找到任何其他方法。