LDAPユーザ検索の上限2000件を突破する方法!ADのMaxPageSizeの変更で取得できない問題を回避!
AD(Active Directory)と連携してADの登録ユーザの情報を
取得するソフトウェアはいろいろあると思いますが、取得件数が多く正しいデータが取れないことってよくあります。
LDAP連携によってADサーバからデータを取得しようにも、
途中で応答が途絶えてしまい、中途半端なところでユーザ情報の取得に失敗してしまいます。
よくある例が1000件までのデータは正常に取れて、1000件を超えたところでエラーになるケース。
私の場合はJavaのjavax.namingパッケージで
ldapsearchコマンドを実行するも2000件を超えるデータで2001件目のデータ参照時に例外が発生してしまいました。
LDAP認証は成功しているのにユーザ検索クエリをかけ、ユーザを1件ずつ情報取得すると
毎回同じところで「SizeLimitExceededException」という例外が発生してしまいます。
直訳するとデータ容量の上限値を超えた例外となる訳ですが、
明らかにサーバ依存の設定値による影響でこのようなエラーが出てしまうんだと思います。
ただこのエラーの原因箇所がADサーバの環境設定値なのか、それとも通信元のAPサーバの設定値、もしくはLDAP通信時に特定のプロパティを渡さねばならないのか「原因はこれだ」という情報が全然見つからず困っていました。
上限エラーの報告はネット上でたくさん挙がっているのに、解決方法があいまいだったりはっきりしたことが書いていません。
私の探し方が悪いのかもしれませんが・・・。
さていろいろ調べたところある手がかりを得ることができました。
ADで2000件を超えるユーザ情報を取得できない原因はMaxPageSize
これといった手掛かりを得られぬまま時間だけが過ぎましたが、
原因はADサーバ側の「MaxPageSize」という環境設定値の上限でした。
これはLDAP応答の最大サイズを指定するもので、デフォルト値が「2000」になっていました。
この状態で外部からLDAPクエリを発行し上限数よりも大きいデータを取得し参照するとエラーとなってしまいます。
私の環境では2000件を超える情報を取得し参照したことで、
取得件数は2000件を超えているのに、不完全なデータが2001件目以降にできてしまい、
存在しないデータを呼び出すことでSizeLimitExceededExceptionの例外が発生してしまいます。
この設定値が原因ということがわかるまでかなりかかってしまいました・・・。
意外にもこういった問題って大きくネットで取り上げられそうだけど、探すもなかなか出てこないんですよね。
もしこれからJavaなどでLDAP認証をし大量のユーザ情報を取得する際に、
同様の現象に悩まされている方は以下の手順で解決できると思うので是非試してみて下さい。
MaxPageSizeの変更方法
ADサーバのコマンドラインツールなどで、「ntdsutil」と入力し、
NTDSUTILを起動させましょう。
手順としては起動後に「LDAP policies」コマンドを用いて、
LDAPプロトコルポリシーの管理画面を表示させます。
「LDAP policies」と入力します。
1 2 3 | c:¥>ntdsutil ntdsutil:LDAP policies ldap policy: |
次に“Connections” コマンドで特定のドメインコントローラに接続します。
ldap policyの入力箇所に「Connections」と入力、
次の行が表示されたら、「Connect to Server “ドメインコントローラのサーバ名”」で
ADのポリシー情報にアクセスします。
1 2 | ldap policy:Connections server connections:Connect to Server "ドメインコントローラのサーバ名" |
ちなみにサーバ名が「sample.local」なら、
「Connect to Server “sample.local”」と入力します。
接続するとユーザの資格情報によって自動的にログインされます。
一度LDAPポリシーにアクセスすると設定値が取得できますので、切断します。
切断するには「quit」と入力します。
1 | server connections:quit |
切断ができましたら、
“Show Values”コマンドで 現在の設定値を確認します。
1 2 3 4 5 | ldap policy:Show Values Policy Current(New) ... MaxPageSize 2000 ... |
すると以下の画像のようにADのポリシー情報の設定が表示され、
その中に「MaxPageSize」の項目が一覧にあります。
私のADサーバの環境では「2000」になっていました。
このMaxPageSizeの上限設定が検索件数に悪影響を与えていた張本人です。
この値を変更するには、以下の手順を続行して下さい。
試しに2000から5000に変更しようと思います。
“Set Maxpagesize to 5000”コマンドで「MaxPageSize」の値を5000に変更することが可能です。
1 | ldap policy:Set Maxpagesize to 5000 |
最後に設定値を上書きするにコミットしましょう。
“Commit Changes”コマンドによりMaxPageSizeの変更値を適用させます。
1 | ldap policy:Commit Changes |
以上でMaxPageSizeの値の変更ができます。
ちなみにポリシー情報を変更しましたが、「gpupdate」コマンドや「サーバ再起動」は行なわなくてもそのまま変更した情報がすぐに反映されるので楽です。
あとは検索上限に引っかかっていたアプリケーション等でテストしてみて下さい。
MaxPageSizeの変更を行なったところ問題なくユーザ検索処理を実行できました。
まあこの設定値だと5000件を超えれば同様の現象が起きてしまいます。
アプリケーションやユーザの登録件数に応じて最適な数値で設定すると良いでしょう。
あまりにも大きい値を設定してしまうと思わぬ問題が発生することも
あるかもしえないのでくれぐれも慎重に行なって下さいね。
最新記事 by よっき (全て見る)
- 「圧着」と「圧接」の違い!コネクタを使った効率的な配線作業! - 2019年10月26日
- 夏の暑さ対策は大丈夫?冷却性能抜群のおすすめCPUクーラー!メモリに干渉しない最強の商品を紹介! - 2018年5月1日
- 自作PC弐号機のケースを換装!SilverStone製のミニタワーで冷却性とかっこよさを追求! - 2018年3月11日
スポンサードリンク