2012-11-15 38 views
5

DirectorySearcher FindOne()を実行してからLDAPサーバーに送信される最初のネットワークパケットが送信されるまでに2〜5秒の初期遅延があります。最初の実行後、後続の実行は約45秒間即座に完了します。高速実行の期間が過ぎると、次の実行が遅れ、その後のすべての実行が即座に完了します。何らかのキャッシュが行われているようですが、それを確認したり、何が初期の遅延を引き起こしているかを説明するリソースは見つかりませんでした。DirectorySearcher FindOne()初期実行時の遅延

私たちはクライアントのWindows 2008サーバーでこれを認識し、独自のWindows 2008およびWindows 7のボックスに再現しました。

私の単純な.NET 4.0 C#アプリの外観は次のとおりです。この遅延は、「Started」と「Finished」の間に発生します。

FindOne()の最初の実行でこの遅延が発生する理由は何ですか?どんな助けでも大歓迎です!

using System; 
using System.Collections.Generic; 
using System.Text; 

using System.DirectoryServices; 

namespace LdapTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] fetchAttributes; 
     fetchAttributes = new string[] { "{string[0]}" }; 

     using (DirectoryEntry searchRoot = new DirectoryEntry("LDAP://localserver/ou=lab,dc=ourdomain,dc=com", "cn=binduser,ou=Services,dc=ourdomain,dc=com", "Password", AuthenticationTypes.ReadonlyServer)) 
     { 
      using (DirectorySearcher searcher = new DirectorySearcher(searchRoot, "(sAMAccountName=UserName)", fetchAttributes, SearchScope.Subtree)) 
      { 
       Console.WriteLine("Started"); 
       SearchResult result = searcher.FindOne(); 
       Console.WriteLine("Finished"); 
      } 
     } 
    } 
} 
+1

http://stackoverflow.com/questions/1846436/system-directoryservices-is-slow – orange

+1

神の母!これは私が何週間も解決策を探していた問題でした!!ありがとうございました –

答えて

2

あなたのバインディングLDAPパスが不要なネットワークトラフィックを避けるために、サーバーを指す場合LDAP ADsPath MSDN articleによると、あなたはServerBindフラグを指定する必要があります。また、サーバーの完全なDNS名を与えることを推奨します。さらに、サーバーを指すときにはReadonlyServerフラグは無意味です。だから私の最初の提案は、のフラグを(おそらく完全なDNS名を与える)ReadonlyServerのフラグに置き換えるか、文字列のサーバー部分を削除することです(例では、LDAP:// ou = lab、dc = ourdomain、dc = comまたはLDAP://ourdomain.com/ou=lab,dc=ourdomain,dc=com)。

もう1つは、ユーザー名を識別名で指定していることです。 DirectoryEntryが使用するコアAPIを調べる場合、lpReservedフラグ[DirectoryEntryのAuthenticationTypesパラメータ]が0 [None]であるか、ユーザー名に識別名を渡すときにADS_USE_SSLフラグが含まれている必要があります。 SecureSocketsLayerフラグを使用するには、Active Directoryでこのフラグを使用する前に証明書サーバーがインストールされている必要があることに注意してください。ユーザー名を別の形式で渡すこともできます。

最後に、this MDSN pageには、認証フラグがなければ、ユーザ名とパスワードがクリアテキストで送信されると記載されています。 Secureフラグを追加する必要があります。

+0

ありがとう! AuthenticationTypeをReadOnlyServerからServerBindに変更すると、期間が15秒から2秒に短縮されました。 – cooperaa