DirectorySearcher#FindOneを連続して呼び出すとエラーになる
-
2012年3月26日 9:10
DirectorySearcher#FindOneを使用して、連続してADのユーザーを確認するプログラムを作成しています。
呼び出す回数が1,000回程度の場合には、正常に動作するのですが、
4,000回以上連続して呼び出すとエラーになる現象が発生しています。
開発環境では、100,000回連続で呼び出してもエラーにはならず、
エラーが発生する環境でも、1,000回ごとに1分スリープすると動作しました。
AD側の設定のような気はしているのですが、ADに詳しくないため調査に手間取っています。
ADに連続アクセスを拒否するような設定があるのでしょうか?
連続して呼び出している部分↓
----------------------------------------------------------------------------------------------------------
using (DirectoryEntry entry = new DirectoryEntry("LDAP://xxx")) {
DirectorySearcher searcher = new DirectorySearcher(entry);
searcher.Filter = "sAMAccountName=" + userName;
searcher.ClientTimeout = new TimeSpan(0, 0, 5);
SearchResult result = searcher.FindOne();
}----------------------------------------------------------------------------------------------------------
例外メッセージ:「サーバーは使用可能ではありません。」
確認すべきログや切り分け方法がありましたらご教授願います。
以上、よろしくお願い致します。
すべての返信
-
2012年3月28日 2:54
DirectorySearche を適切に解放するようにされても同じでしょうか?
実際のコードではされているのかもしれませんが、書かれたコードでは Dispose されてないので、サーバー側のリソースを消費しちゃってエラーになる等を想像しました。見当違いならごめんなさい。AD 側の設定有無についても知りません。
- 回答の候補に設定 山本春海Moderator 2012年4月2日 9:06
- 回答としてマーク 山本春海Moderator 2012年4月16日 6:42
-
2012年4月6日 0:38
回答ありがとうございます。
ご指摘の通り、DirectorySearcher の Disposeは呼んでいません。
ただ、テスト環境では Disposeしなくてもエラーは発生していません。
初歩的な質問なのですが、DirectorySearcher の Disposeは
必ず呼ぶ必要があるのでしょうか??
-
2012年4月6日 0:58
奇妙な発言に聞こえます。本番環境とテスト環境で挙動が異なるなら、それはテスト環境が不十分な構成だったと言えるのでは? それと、テスト環境でエラーが出ないことに何の意味があるのでしょうか。
- IDisposableを実装するクラスは全てDispose()を呼ぶべきです。Dispose()の中身が空なら直ぐにreturnするだけですし。
- DirectoryEntry周りはコネクションの管理がややこしくなっているそうです。可能な限り解放(Dispose()呼び出し)した方がいいでしょう。
- 回答としてマーク 山本春海Moderator 2012年4月16日 6:43
-
2012年4月6日 4:16モデレータ
こんにちは、やまぞう さん。
フォーラムのご利用ありがとうございます。オペレーターの山本です。
みなさんから有効な情報をいただいているかと思います。
エラー内容から検索してみただけですが、以下のような情報もありましたのでご参考まで。
Active Directory bulk data update error System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) The server is not operational.
http://social.technet.microsoft.com/Forums/en-US/winserverDS/thread/7f502924-937a-4a04-99c1-dfaa4233e9c7
テスト環境と本番環境の動作の違いについてはわかりませんが、以下は問題の切り分けに参考になるかもしれません。
[ADSI TroubleShooting] : 大量のユーザ登録処理とかを一気に行うとポート枯渇が起きる
http://blogs.technet.com/b/jpilmblg/archive/2009/03/27/adsi-troubleshooting.aspx[ADSI] セッションの張り方に伴う一時ポートの使われ方 ~ 同じ関数の組み合わせでも順序などで使われ方が変わる ~
http://blogs.technet.com/b/jpilmblg/archive/2009/04/10/adsi_2d00_session_5f00_and_5f00_dynamic_5f00_port.aspx
追記:
なお、OS 側の設定に関する不明点などがある場合などは、IT プロ向けの TechNet フォーラムがございます。問題切り分けをおこなって、TechNet フォーラムのご利用もご検討されたほうがいいかもしれません。
_____________________
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海
- 編集済み 山本春海Moderator 2012年4月6日 4:25 追記
- 回答としてマーク 山本春海Moderator 2012年4月16日 6:43
-
2012年7月18日 4:24
コメントありがとうございます。
System.Runtime.InteropServices.COMException (0x8007203A): サーバーは使用可能ではありません。
DirectoryEntryとDirectorySearcherを、毎回Disposeしたのですが、状況は変わりませんでした。
処理途中で以下のエラーが発生することがあります。
場所 System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
場所 System.DirectoryServices.DirectoryEntry.Bind()
場所 System.DirectoryServices.DirectoryEntry.get_AdsObject()
場所 System.DirectoryServices.DirectorySearcher.FindAll(BooleanfindMoreThanOne)
場所 System.DirectoryServices.DirectorySearcher.FindOne()ただ、正常に終了することもあるので、プログラムよりもAD、OS、ネットワークの設定が原因のような気がしています。
AD等で短時間に連続してアクセスするクライアントにエラーを返す設定なんてあるのでしょうか?

