2017-01-27 16 views
0

У меня возникли проблемы с поиском подходящего способа перемещения человека в Active Directory между организационными подразделениями с Spring LDAP.Ошибка Spring LDAP Изменение отличительного имени

Я использую Spring LDAP 2.0.4.RELEASE. Я пробовал четыре разных способа установить distinguishedName на объекте человека, который я пытаюсь переместить, и каждый раз получаю ошибку LDAP.

1) Установка distinguishedName как String, в том числе dc части.

final Name currentDn = LdapNameBuilder.newInstance("CN=Some Person,OU=Old,OU=Domain Users").build(); 
final String newDn = "CN=Some Person,OU=New,OU=Domain Users,dc=my,dc=domain"; 

final Attribute attributeChange = new BasicAttribute("distinguishedName", newDn); 
final ModificationItem modificationItem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attributeChange); 
ldapTemplate.modifyAttributes(currentDn, new ModificationItem[]{modificationItem}); 

Это дает мне следующее сообщение об ошибке:

javax.naming.directory.InvalidAttributeValueException: [LDAP: error code 19 - 000020B1: AtrErr: DSID-030F052C, #1: 0: 000020B1: DSID-030F052C, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 31 (distinguishedName) ]; remaining name 'CN=Some Person,OU=Old,OU=Domain Users'

2) Установка distinguishedName как String, безdc части.

final Name currentDn = LdapNameBuilder.newInstance("CN=Some Person,OU=Old,OU=Domain Users").build(); 
//the line below is the only line changed from (1) 
final String newDn = "CN=Some Person,OU=New,OU=Domain Users"; 

final Attribute attributeChange = new BasicAttribute("distinguishedName", newDn); 
final ModificationItem modificationItem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attributeChange); 
ldapTemplate.modifyAttributes(currentDn, new ModificationItem[]{modificationItem}); 

Это дает мне другую ошибку:

org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 80 - 00002089: UpdErr: DSID-031B0D38, problem 5012 (DIR_ERROR), data 5 ]; remaining name 'CN=Some Person,OU=Old,OU=Domain Users'

3) Установка distinguishedName как LdapName, в том числе dc части.

final Name currentDn = LdapNameBuilder.newInstance("CN=Some Person,OU=Old,OU=Domain Users").build(); 
final Name newDn = LdapNameBuilder.newInstance("CN=Some Person,OU=New,OU=Domain Users,dc=my,dc=domain").build(); 

final Attribute attributeChange = new BasicAttribute("distinguishedName", newDn); 
final ModificationItem modificationItem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attributeChange); 
ldapTemplate.modifyAttributes(currentDn, new ModificationItem[]{modificationItem}); 

Это дает мне ту же ошибку, что и (1).

4) Установка distinguishedName как LdapName, безdc части.

final Name currentDn = LdapNameBuilder.newInstance("CN=Some Person,OU=Old,OU=Domain Users").build(); 
final Name newDn = LdapNameBuilder.newInstance("CN=Some Person,OU=New,OU=Domain Users").build(); 

final Attribute attributeChange = new BasicAttribute("distinguishedName", newDn); 
final ModificationItem modificationItem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attributeChange); 
ldapTemplate.modifyAttributes(currentDn, new ModificationItem[]{modificationItem}); 

Это дает мне ту же ошибку, что и (1).

Что мне не хватает? Разве это не правильный способ изменить distinguishedName на объект объекта Active Directory с помощью Spring LDAP? Сообщения об ошибках не очень полезны.

ответ

0

По-видимому, вы не можете изменить атрибут distinguishedName с помощью операции изменения. Правильный способ сделать это с помощью Spring LDAP использует метод LdapTemplate.rename. Вы можете передать oldDn и newDn как String объектов или Name объектов.

final Name oldDn = LdapNameBuilder.newInstance("CN=Some Person,OU=Old,OU=Domain Users").build(); 
final Name newDn = LdapNameBuilder.newInstance("CN=Some Person,OU=New,OU=Domain Users").build(); 

ldapTemplate.rename(oldDn, newDn); 
+0

Это потому, что DN не является атрибутом. Соответствующая операция/запрос LDAP является MODRDN, а не простой MODIFY –