2ntブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ActiveDirectoryのグループからメンバを1500以上取り出す方法

こんにちは、ふぃぶです。

今回はちょっと毛色の違う話をば・・・。
ActiveDirectoryに設定しているグループのメンバに1500件以上登録しているとします。
VBやC#でDirectorySearcherを使用して取得しようとしたとき、メンバは1500件までしか取得できません。

どうやらActiveDirectoryは1500以上取るのが無理っぽいです。
では、どうやるか。
解決方法がありました。以下のサイトさんで紹介されています。

【ITQ Blogs】
http://goo.gl/4oqvh


英語記事なので若干解説を。(google翻訳を駆使しただけですが・・・)間違ってたら許してね。
ActiveDirectoryからメンバを1500人以上取得するには2つ方法があるそうです。
記事内でソースコードが2つ紹介されています。
ただ、一つ目のコードはパフォーマンスを考えると少々問題があるようなので
2つ目のコードをオススメされています。

2つ目のコードをざっくりと説明。
コレは何回かに分けてデータを取得する事で1500人以上を取得できるようにしています。
サンプルのコードでは1回の処理で999件取得しています。

12: var properties = new[]
13: { string.Format("member;range={0}-{1}", @from, to) };

この設定が重要です。
from,toを変更する事によって指定した範囲でデータを取得しています。
単純な話、"member;range=0-999"て書いたら0~999件目のデータを取得します。
"member;range=1000-1999"て書いたら1000~1999件目のデータを取得します。

全体的に処理内容を説明しますと・・・
・17,18行目でActiveDirectoryより指定した条件データを取得
・23行目で取得済みの結果セットを取得
・24行目から、結果セットを1件ずつ処理
・27行~30行目でプロパティ名が"member;"で始まるものを取得
これは上記でポイントとした"member;range=・・・"の部分をとるためです。
範囲の部分は0-999や1000-1999など動的になるため、"member;"で始まるものという指定で取得しています

・34行目で、プロパティ名を指定してデータを取得します。
・35行目でようやくメンバー1件1件の情報を取得します。
・51行目でfromの値をインクリメントし、次のデータを処理しに行きます。
 サンプルですと1ループ目が0-998件目、2ループ目が999-1998件目と取得していきます。
 これをグループに設定されているメンバが最後になるまで繰り返します。


また記事の最後に記載されていますが、
サンプルコードですとグループにメンバが1件も設定されていなかったりすると
上手くいかなかったりするので、ActiveDirectoryよりデータを取得した時点で
設定されているメンバの件数が0件の場合処理をしないような判定が必要です。

取得ループの処理もExceptionをキャッチして終了するような形になっているため、
正式にグループよりメンバを取得しきったことを判断してループを終わりにする処理を追記する必要も有ります。
(Exceptionキャッチして抜けてもバグりはしないと思いますが・・・)
最後のデータを判定する方法は”member;range=”の記述で判断できます。
例えば設定メンバが1件しかない状態で取得する範囲を0-999と指定した場合、
プロパティ名は "member;range=1-*"となります。
プロパティ名の最後が*である事を判定する事によりデータがこれ以上ない事がわかるため
それをキーとしbreakを張ってください。


以上でした。
完全に備忘録的な記事になってしまった。
しかし海外の人は本当に頭いいよねぇ・・・。


コメント
コメントの投稿
管理者にだけ表示を許可する