5

System.DirectoryServices.DirectorySearcher を使用して sAMAccountName ルックアップを実行しています。これは問題なく動作しますが、非常に大きいと思われる特定の AD にクエリを実行すると、検索がタイムアウトすることがよくあります。少し調査した結果、System.DirectoryServices.Protocols を使用した検索は、大規模な AD に対してクエリを実行する場合により高速になることがわかりました。プロトコルを使用して、タイムアウトに違いがあるかどうかを確認するために、私たちが持っているものを再作成しようとしています。これは現在そこにあるものです:

Dim Entry As New DirectoryEntry(anLDAPURL, aDomainUserName, aPassword)

Dim obj As Object = Entry.NativeObject 'Force Authentication on Active Directory Server

Dim Filter As String = String.Format("(sAMAccountName={0})", aDomainUserName)

Dim Search As New DirectorySearcher(Entry, Filter)
Search.PropertiesToLoad.Add(SID)
Search.PropertiesToLoad.Add(ACCOUNTISLOCKEDOUT)
Search.PropertiesToLoad.Add(ACCOUNTISDISABLED)

Dim Results As SearchResult = Search.FindOne()

これは問題なく動作し、非常に高速です (上記のタイムアウトの場合を除く)。そして、これは私がそれをテストできるように変更しようとしているものです:

Dim credentials As New System.Net.NetworkCredential(aDomainUserName, aPassword)
Dim directoryIdentifier As New System.DirectoryServices.Protocols.LdapDirectoryIdentifier("ldap-ad.example.org")

Using connection As New System.DirectoryServices.Protocols.LdapConnection(directoryIdentifier, credentials, Protocols.AuthType.Basic)
    Dim attributes() As String = {SID, ACCOUNTISLOCKEDOUT, ACCOUNTISDISABLED}

    Dim search As New System.DirectoryServices.Protocols.SearchRequest(
    "dc=example,dc=org",
    String.Format("(sAMAccountName={0})", aDomainUserName),
    Protocols.SearchScope.Subtree,
    attributes)

    Dim response As System.DirectoryServices.Protocols.SearchResponse = DirectCast(connection.SendRequest(search), System.DirectoryServices.Protocols.SearchResponse)
End Using

上記のコードは、結果を返すという点で機能しますが、元のコードよりもはるかに遅くなります。クエリを実行しようとしている方法が非効率的であると思われますが、高速化するためにどのように設定すればよいかよくわかりません。

4

2 に答える 2

4

メソッドで返された結果の「参照追跡」が原因である同じ問題に遭遇しましたSystem.DirectoryServices.Protocols.LdapConnection.SendRequest。これは、DNS エントリを持たない「偽の」ドメイン名「corp.org」が原因でした (SendRequest結果の DNS ルックアップに多くの時間を浪費していました)。紹介の追跡を無効にするには:

var conn = new LdapConnection(...);
conn.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
于 2014-03-19T21:53:09.307 に答える
0

コンストラクター ( )の LDAP パスに基づいて、SearchRequestコンストラクター ( )"dc=example,dc=org"でサーバーを指定しているようです。サーバー ( ) の代わりにドメインを指定してみましたか?LdapDirectoryIdentifierldap-ad.example.orgexample.org

0 または 1 の結果しか返さないインデックス付きプロパティを検索している場合、2 つのメソッドがどのように異なるべきか、私にはよくわかりません。

于 2013-06-13T03:42:54.050 に答える