none
DirectorySearcher#FindOneを連続して呼び出すとエラーになる RRS feed

  • 質問

  • 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月26日 9:10

回答

  • DirectorySearche を適切に解放するようにされても同じでしょうか?

    実際のコードではされているのかもしれませんが、書かれたコードでは Dispose されてないので、サーバー側のリソースを消費しちゃってエラーになる等を想像しました。見当違いならごめんなさい。AD 側の設定有無についても知りません。

    • 回答の候補に設定 山本春海 2012年4月2日 9:06
    • 回答としてマーク 山本春海 2012年4月16日 6:42
    2012年3月28日 2:54
  • 奇妙な発言に聞こえます。本番環境とテスト環境で挙動が異なるなら、それはテスト環境が不十分な構成だったと言えるのでは? それと、テスト環境でエラーが出ないことに何の意味があるのでしょうか。

    • IDisposableを実装するクラスは全てDispose()を呼ぶべきです。Dispose()の中身が空なら直ぐにreturnするだけですし。
    • DirectoryEntry周りはコネクションの管理がややこしくなっているそうです。可能な限り解放(Dispose()呼び出し)した方がいいでしょう。
    • 回答としてマーク 山本春海 2012年4月16日 6:43
    2012年4月6日 0:58
  • こんにちは、やまぞう さん。

    フォーラムのご利用ありがとうございます。オペレーターの山本です。

    みなさんから有効な情報をいただいているかと思います。
    エラー内容から検索してみただけですが、以下のような情報もありましたのでご参考まで。

      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 フォーラムのご利用もご検討されたほうがいいかもしれません。
    _____________________
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2012年4月6日 4:16

すべての返信

  • DirectorySearche を適切に解放するようにされても同じでしょうか?

    実際のコードではされているのかもしれませんが、書かれたコードでは Dispose されてないので、サーバー側のリソースを消費しちゃってエラーになる等を想像しました。見当違いならごめんなさい。AD 側の設定有無についても知りません。

    • 回答の候補に設定 山本春海 2012年4月2日 9:06
    • 回答としてマーク 山本春海 2012年4月16日 6:42
    2012年3月28日 2:54
  • 回答ありがとうございます。

    ご指摘の通り、DirectorySearcher の Disposeは呼んでいません。

    ただ、テスト環境では Disposeしなくてもエラーは発生していません。

    初歩的な質問なのですが、DirectorySearcher の Disposeは

    必ず呼ぶ必要があるのでしょうか??

    2012年4月6日 0:38
  • 奇妙な発言に聞こえます。本番環境とテスト環境で挙動が異なるなら、それはテスト環境が不十分な構成だったと言えるのでは? それと、テスト環境でエラーが出ないことに何の意味があるのでしょうか。

    • IDisposableを実装するクラスは全てDispose()を呼ぶべきです。Dispose()の中身が空なら直ぐにreturnするだけですし。
    • DirectoryEntry周りはコネクションの管理がややこしくなっているそうです。可能な限り解放(Dispose()呼び出し)した方がいいでしょう。
    • 回答としてマーク 山本春海 2012年4月16日 6:43
    2012年4月6日 0:58
  • こんにちは、やまぞう さん。

    フォーラムのご利用ありがとうございます。オペレーターの山本です。

    みなさんから有効な情報をいただいているかと思います。
    エラー内容から検索してみただけですが、以下のような情報もありましたのでご参考まで。

      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 フォーラムのご利用もご検討されたほうがいいかもしれません。
    _____________________
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2012年4月6日 4:16
  • コメントありがとうございます。
    DirectoryEntryとDirectorySearcherを、毎回Disposeしたのですが、状況は変わりませんでした。
    処理途中で以下のエラーが発生することがあります。

    System.Runtime.InteropServices.COMException (0x8007203A): サーバーは使用可能ではありません。
       場所 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等で短時間に連続してアクセスするクライアントにエラーを返す設定なんてあるのでしょうか?

    2012年7月18日 4:24