通过 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
属性,它应该可以工作。
我使用 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
属性,它应该可以工作。