Как мне разрешить ответ MS AD "WILL_NOT_PERFORM" при попытке изменить пароль в scala с незакрепленным LDAP SDK? - PullRequest
5 голосов
/ 23 июля 2011

Я борюсь с 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 = Тестер Dude, 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', диагностическое сообщение = '0000001F: SvcErr: DSID-031A11E5, проблема 5003 (WILL_NOT_PERFORM), данные 0)

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

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

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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 05 августа 2014

соединение недостаточно защищено

Цитата из: http://support.microsoft.com/kb/269190

Чтобы изменить этот атрибут, клиент должен иметь 128-битное соединение по протоколу 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, если вы используете старый пароль, который уже есть в истории.

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

  1. безопасное соединение

  2. используйте комбинацию 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)))
-
4 голосов
/ 23 июля 2011

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

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

Сделал трюк.

1 голос
/ 23 июля 2011

Я предполагаю, что "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)

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

...