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