Вопрос по ldap, scala, java, unboundid-ldap-sdk, active-directory – Оказывается, он должен быть в кодировке UTF-16LE, а затем преобразован в base64. val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary (('' '+ "Jfi8ZH8 # k" +' "'). getBytes (" UTF-16LE ")) Сделал свое дело. Опубликуйте это как ответ, когда сможете.

5

юсь с Active Directory, пытаясь заставить его сменить пароль. Я нашел тонны полезной информации, но все еще получаю постоянную ошибку.

Некоторый код:

import com.unboundid.ldap.sdk._
import com.unboundid.util.ssl._


def main(args: Array[String]) : Unit = {

var sslUtil = new SSLUtil( new TrustAllTrustManager() )
var con = new LDAPConnection(sslUtil.createSSLSocketFactory())
con.connect("ldap.example.net", 636)
con.bind("ldapadmin", "adminpasswd")
val newPass = "Jfi8ZH8#k".getBytes("UTF-16LE");
val modRequest = new ModifyRequest("dn: cn=Tester Dude,ou=Lab,ou=Org,ou=Provider,DC=example,DC=net",
  "changetype: modify",
  "replace: unicodePwd",
  "unicodePwd: " + '"' + newPass + '"')

println("\nGoing to try to set password to " + newPass + " with: " + modRequest.toString())

try {
  con.modify(modRequest)
} catch {
  case lde:LDAPException => println("failed LDAPException: " + lde.toString())
}

}

Итак, я получаю это как ошибку времени выполнения:

Попытка установить пароль на [B @ 6dd1627e с помощью: ModifyRequest (dn = 'cn = Тестер Чувак, ou = Lab, ou = Org, ou = Provider, DC = пример, DC = net', моды = {REPLACE unicodePwd} )

Сбой LDAPException: LDAPException (resultCode = 53 (нежелание выполнять), errorMessage = '0000001F: SvcErr: DSID-031A11E5, проблема 5003 (WILL_NOT_PERFORM), данные 0', диагностикаMessage = '0000001F: SvcErr: DSID-031A11FE_REFER_NER_5_NER_5_RU_NE_005 ), данные 0 ')

Таким образом, среди вещей, которые я знаю, может вызвать эту ошибку:

Не подключается через SSL. (Дело не в этом, и я проверил, что на 100% уверен, что использую netstat на порту 636)Передача пароля, который нарушает политику паролей Active Directory. (Я тестировал установку этого точного пароля вручную; он отклоняет короткие / простые пароли, но он принимает тот, который я использую в этом коде)

Я пробовал как с, так и без лишних кавычек вокруг пароля.

Таким образом, наиболее полезным источником информации было:

http://www.dirmgr.com/blog/2010/8/26/ldap-password-changes-in-active-directory.html

Но я исчерпал каждое предложение там (и много других мест).

Я также попробовал несколько других вещей, включая установку пароля для другого действительного пользователя, который был добавлен вручную. (Этот был добавлен также через SDK.)

Другие операции работают нормально. Я удалил нерелевантный код, но смог найти, распечатать атрибуты, добавить и удалить пользователя без проблем; но этот запрос на изменение не выполняется. Если я установил ModifyRequest, чтобы изменить какой-либо другой атрибут, например, связанный с ним адрес электронной почты, это также работает нормально.

Ваш Ответ

3   ответа
9
соединение недостаточно безопасное

http://support.microsoft.com/kb/269190

Чтобы изменить этот атрибут, клиент должен иметь 128-битное соединение по протоколу Secure Socket Layer (SSL) с сервером.

Так что даже если все остальное выглядит правильно, вы все равно можете получитьSvcErr: DSID-03190F4C, problem 5003 (WILL_NOT_PERFORM) если соединение считается небезопасным.

не хватает прав администратора

Запрос на изменение может потерпеть неудачу, если вы попытаетесь сделатьreplace без достаточных прав.

dn: CN=johndoe,OU=Users,DC=example,DC=com
changetype: modify
replace: unicodePwd
unicodePwd:: base64(utf16le(quoted(password)))
-

Вы получитеSecErr: DSID-03150E47, problem 4003 (INSUFF_ACCESS_RIGHTS) в этом случае. Это происходит, если вы пытаетесьbind с непривилегированным аккаунтом.

история паролей

Некоторым администраторам нравится иметь длинную историю паролей (например, последние 24 сохраненных пароля). Вы получитеCONSTRAINT_ATT_TYPE если вы используете старый пароль, который уже есть в истории.

обычный пользователь

обеспечить соединение

использоватьdelete-add комбо.

например

dn: CN=johndoe,OU=Users,DC=example,DC=com
changetype: modify
delete: unicodePwd
unicodePwd:: base64(utf16le(quoted(old password)))
-
add: unicodePwd
unicodePwd:: base64(utf16le(quoted(new password)))
-
1

"unicodePwd: " + '"' + newPass + '"' обходится ваша кодировка (какString должен быть снова преобразован в байты, и я уверен, что он не использует правильную кодировку).

Попробуйте использовать версию MofifyRequest, которая принимаетModification объекты, а затем использовать конструктор, который принимает значение атрибута какбайтов.

val newPass = "\"Jfi8ZH8#k\"".getBytes("UTF-16LE")
// note the dquotes inside the string

val mod = new Modification(ModificationType.REPLACE, "unicodePwd", newPass)

так же, как в блоге, на который вы ссылаетесь ...

Оказывается, он должен быть в кодировке UTF-16LE, а затем преобразован в base64. val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary (('' '+ "Jfi8ZH8 # k" +' "'). getBytes (" UTF-16LE ")) Сделал свое дело. Опубликуйте это как ответ, когда сможете. mattwallace
4

он должен быть в кодировке UTF-16LE, а затем преобразован в base64.

val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary(('"'+"Jfi8ZH8#k"+'"').getBytes("UTF-16LE"))

Сделал трюк.

Похожие вопросы