通过JNDI LDAP将用户添加为AD组的成员-存在条目

通过JNDI LDAP将用户添加为AD组的成员-存在条目,ldap,jndi,Ldap,Jndi,我已经使用JNDI LDAP向AD添加了一个新用户。我还以编程方式启用了该帐户。但是,如果我试图将用户添加到广告组,我会得到一个错误,表明一个条目已经存在。有关引发的异常,请参见下面的结果 “Domain Admins”是组名,但它似乎在抱怨我试图重新添加组。这是我的密码 我在论坛上找到的任何例子都是类似的 public void addUserToGroup() throws NamingException { String groupDN = "CN=Domain Admins,CN

我已经使用JNDI LDAP向AD添加了一个新用户。我还以编程方式启用了该帐户。但是,如果我试图将用户添加到广告组,我会得到一个错误,表明一个条目已经存在。有关引发的异常,请参见下面的结果

“Domain Admins”是组名,但它似乎在抱怨我试图重新添加组。这是我的密码

我在论坛上找到的任何例子都是类似的

public void addUserToGroup() throws NamingException {

   String groupDN = "CN=Domain Admins,CN=Users,DC=mydomain,DC=org";

// Create the objectclass
    Attribute objClasses = new BasicAttribute("objectClass");
    objClasses.add("top");
    objClasses.add("group");

// Create a entry set of attributes
    Attributes attrs = new BasicAttributes();
    Attribute member = new BasicAttribute("member", getUserDN("jdoe"));

// Add these to the container
    attrs.put(objClasses);
    attrs.put(member);
    try {
        context.modifyAttributes(groupDN, DirContext.ADD_ATTRIBUTE, attrs);
} catch (Exception e) {
   LOGGER.severe("Failed to Add User to Domain Admins -- ");
}
}

public String getUserDN(String aUsername) {
    return "CN=" + aUsername + ",CN=" + "Users,DC=mydomain,DC=org";
}
这是引发的结果异常

javax.naming.NameAlreadyBoundException:[LDAP:错误代码68-00000562:UpdErr:DSID-031A11E2,问题6005(条目_存在),数据0
]; 剩下的名字‘CN=Domain管理员,CN=Users,DC=mydomain,DC=org’

我已经有一段时间没有和JNDI(顺便说一句,这是一个有20年历史的图书馆)一起工作了,但我仍然可以在这里提供一些东西

LDAP错误通常意味着他们所说的,所以我不怀疑错误的确切含义(条目已经存在)。这当然与您的代码相矛盾,您的代码似乎只想执行ldapmodify操作


我想看看“在线”会发生什么,那么使用tcpdump或wireshark获取LDAP协议,并检查它是否实际发送MOD或ADD操作如何?理论上,这个错误68应该只来自ADD,所以让我们看看那些数据包,看看到底发生了什么。

您正在添加一个属性,该属性的值已经存在于对象上:
objectClass
。 使用
DirContext.ADD_属性时
LDAP服务器采用新值,而不是替换现有值

你为什么要在修改中加上这个?只需添加
成员
属性就足够了。
尝试不使用
objectClass
属性,它应该可以工作

克里斯,我感谢你愿意帮忙。我对tcpdump或wireshark不太熟悉,无法确保我捕获了您想要的内容。让我看看我是否能找到一些例子或指导如何让你得到你想要的。我不确定我们的安全人员对在公司网络上使用嗅探器有多感兴趣。如果使用得当,“嗅探器”是非常有用和无害的工具。您不需要捕获其他机器的流量,只需要捕获您自己的流量。在正常的交换环境中,“嗅探”其他机器的流量通常是不可能的。您要做的是在端口389上进行筛选。这将减少捕获到相关和有用的内容。很容易找到过滤方法。在您的LDAP框上类似的东西应该可以工作:sudo tcpdump-w/path/to/outputfile.pcap port LDAP或port LDAP,然后获取output.pcap文件并在Wireshark中打开。这会很有启发性。好的,这是我拍到的。我已经更改了IP地址和密码以保护无辜者…Chris,请参阅上面的TcpDump输出部分。我无法将其放入评论部分。您应该使用修改,而不是添加。我正在添加属性,因为该用户是另一个成员。我认为modify是将一个状态或参数更改为另一个状态或参数。例如更改电子邮件地址。谢谢,我将在下周回去工作时尝试一下。将用户的DN值添加到
member
属性将使该用户成为组的成员。用户对象应该预先存在。