|
2004年5月27日
『どっとねっとと雑多な日々 28』
ほぼ 1 ヶ月の間、BLOG も ML もほとんど書き込みをしていないので、おがわみつぎは何してるんだ? と疑問に思っている方もいらっしゃると思います。
前回の PASSJ ボードリーダーニュースを読んでいただいた方はお分かりだと思いますが、本業が忙しく首が回らない状態が続いているからです。
PASSJ なのでデータベースに関連した話題を書きたいのですが、このところデータベースに触っていないので、元ネタがありません。(_ _)
代わりにこのところやっている Active Directory と .NET Framework の System.DirectoryServices について Tips を含めて書きたいと思います。
私の担当は Active Directory に登録されているユーザでも、ドメインに参加していないコンピュータから認証できるようにする .NET Framework の Assembly の作成と、Active Directory に登録していて、セキュリティグループに所属するユーザの一覧を CSV ファイルに出力する、コマンドラインツールの作成です。
# CSVDE という標準で用意されているツールもあるのですが、要件を満たさないので自作しました。
前者に関しては短期間で作成できたので問題が無かったのですが、後者に関してはいろいろと苦労させられました。
何が苦労したかというと、実際のコーディングは先月の下旬にはほぼ完了して、本番擬似環境でのテスト待ちになっていました。
そして先日、本番擬似環境の構築ができたため、そこで指定したセキュリティグループに所属するユーザが CSV に出力できるかをテストしたところ、問題が発覚しました。
問題は 3 つありました。
1.セキュリティグループに所属しているユーザのリストが 1,500 に限定される。
2.大量のユーザを何度も LDAP で検索していると突然「サーバが利用可能では
ありません」というエラーを発生する。
3. 10,000 ユーザを出力するのに 30 分かかる。
1. の問題の回避策は「Active Directory と私 - セキュリティグループに所属するメンバーについて」という BLOG に書きました。
http://blogs.sqlpassj.org/mitsugi/archive/2004/05/24/2449.aspx
簡単にいうと所属しているユーザが格納されているプロパティ名は「member」というものですが、1,500 以上のオブジェクトを扱う場合には「member;range=1-1499」などと range の指定をしながらループを処理していくというものです。
なお、この 1,500 という数値は Windows Server 2003 の場合で、Windows 2000 Server の場合は 1,000 になります。
2. と 3. の問題が複雑で、低速ネットワーク(10BASE-T)から接続して実行する場合は、DEBUG 出力をすると成功し、サーバ上で実行するとエラーになったりならなかったりと一定ではありませんでした。
当初は System.DirectoryServices.DirectorySearcher のプロパティにある ServerTimeLimit と ClientTimeout の値をかなり大きめに設定すれば回避できるかと試行錯誤しました。
しかし CPU の使用率を見ていると、CPU を常に使用しているわけではなく、一定期間 CPU を使うとしばらく CPU 使用率が 0% になっているので、これが問題ではないというのがわかりました。
いろいろプロパティを試した結果、一番効果が上がったのが
System.DirectoryServices.DirectorySearcher.PageSize
の値を大きくするとことでした。
これによりエラーの解消と処理速度の向上(30 分が 3 分)になり、事なきを得ました。
この問題はよくある話で、開発環境は少人数でのテストを行っていて、大量ユーザが登録されている状態でのテストをしていなかったため、問題が後になって発覚するという典型例です。
皆さんも注意してくださいね。
開発はひと段落したのですが、これからカットオーバに向けた作業がいろいろとあり、今月もまだまだ奈落の底の住人と化していますので、レスポンスは期待しないでください。(_ _)
どうしても私に聞きたいことがあれば、PASSJ ML で呼び出してください。
|