7

パスワードを変更できるようにするために、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=Tester Dude,ou=Lab,ou=Org,ou=Provider,DC=example,DC=net', mods={REPLACE unicodePwd} )

失敗した LDAPException: LDAPException(resultCode=53 (実行したくない)、errorMessage='0000001F: SvcErr: DSID-031A11E5、問題 5003 (WILL_NOT_PERFORM)、データ 0 '、diagnosticMessage='0000001F: SvcErr: DSID-031A11E5、問題 5003 (WILL_NOT_PERFORM) )、データ 0 ')

したがって、私が知っていることの中で、このエラーが発生する可能性があります。

  1. SSL経由で接続していません。(ここではそうではなく、netstat を使用してポート 636 を使用していることを 100% 確認しました)
  2. Active Directory のパスワード ポリシーに違反するパスワードを渡す。(正確なパスワードを手動で設定することをテストしました。短い/単純なパスワードは拒否されますが、このコードで使用しているパスワードは受け入れられます)

パスワードを余分な引用符で囲む場合と付けない場合の両方で試しました。

これまでで最も有用な情報源は次のとおりです。

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

しかし、私はそこにあるすべての提案を使い果たしました (そして他の多くの場所)。

また、手動で追加された別の有効なユーザーのパスワードを設定するなど、他にもいくつか試しました。(これもsdk経由で追加されました。)

他の操作は問題なく動作しています。無関係なコードを削除しましたが、問題なくユーザーの検索、属性の出力、追加、および削除を行うことができました。しかし、この変更リクエストは失敗します。関連付けられている電子メールなど、他の属性を変更するように ModifyRequest を設定すると、それも正常に機能します。

4

4 に答える 4

11

接続が十分に安全でない

引用: 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場合は、 が表示されます。

一般ユーザー

  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)))
-
于 2014-08-05T00:28:36.240 に答える
4

UTF-16LE でエンコードしてから base64 に変換する必要があることがわかりました。

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

トリックをしました。

于 2011-07-23T17:43:36.337 に答える
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)

リンク先のブログ投稿のように...

于 2011-07-23T04:03:28.990 に答える