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

Adding User as member to AD Group through JNDI LDAP - Entry Exists

我使用 JNDI LDAP 向 AD 添加了一个新用户。我也以编程方式启用了该帐户。但是,如果我尝试将用户添加到 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 (ENTRY_EXISTS),数据 0 ];剩余姓名 'CN=Domain Admins,CN=Users,DC=mydomain,DC=org'

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

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

我想看看会发生什么 "on the wire",那么如何使用 tcpdump 或 wireshark 获取 LDAP 协议,并检查它是否真的在发送 MOD 或 ADD 操作?理论上这个错误 68 应该只来自 ADD,所以让我们看看这些数据包并找出真正发生的事情。

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

为什么要将其添加到修改中?只需添加 member 属性就足够了。 尝试不使用 objectClass 属性,它应该可以工作。