我已经使用JNDI LDAP向AD添加了新用户。而且我还以编程方式启用了该帐户。但是,如果尝试将用户添加到AD组中,则会出现错误并指出已存在条目。有关抛出异常的信息,请参见下面的结果。
“域管理员”是组名,但似乎在抱怨我试图重新添加该组。这是我的代码。
我在论坛上找到的任何示例都执行类似的操作。
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 =域管理员,CN =用户,DC = mydomain,DC = org'
答案 0 :(得分:1)
您要添加一个属性,该属性具有对象objectClass
上已经存在的值。
使用DirContext.ADD_ATTRIBUTE
时,LDAP服务器采用新值,而不替换现有值。
为什么要将它添加到修改中?仅添加member
属性就足够了。
尝试不使用objectClass
属性,它应该可以工作。
答案 1 :(得分:0)
自从我使用JNDI(已经有20年历史的BTW图书馆)以来已经有一段时间了,但是我在这里仍然可以提供一些东西。
LDAP错误通常表示他们所说的话,因此我毫不怀疑该错误表示它的意思(条目已经存在)。这当然与您的代码矛盾,后者似乎只想执行ldapmodify操作。
我想看看“在线”发生了什么,那么如何使用tcpdump或wireshark获取LDAP协议,并检查它实际上是在发送MOD还是ADD操作呢?从理论上讲,此错误68应该仅来自ADD,因此让我们看看这些数据包并找出实际发生的情况。