我们正在使用System.DirectoryServices.DirectorySearcher来执行sAMAccountName查找。这种方法很好,除了在查询某个AD时,我们怀疑它非常大,搜索通常会超时。在做了一些研究之后,我发现在查询大型AD时,使用System.DirectoryServices.Protocols的搜索速度会更快。我正在尝试使用协议重新创建我们所拥有的内容,以查看是否会对超时产生任何影响。这就是目前的情况:
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
上面的代码有效,因为它返回一个结果,但比原始代码慢得多。我怀疑我试图查询的方式效率低下但是我不太确定如何设置它以便它更快。
答案 0 :(得分:1)
我遇到了同样的问题,最终归因于"推荐追逐"在System.DirectoryServices.Protocols.LdapConnection.SendRequest
方法的返回结果中。这是因为"假的"域名" corp.org"没有任何DNS条目(因此SendRequest
浪费了大量时间对结果进行DNS查找)。要禁用引荐追踪:
var conn = new LdapConnection(...);
conn.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
答案 1 :(得分:0)
根据SearchRequest
构造函数("dc=example,dc=org"
)中的LDAP路径,您似乎在LdapDirectoryIdentifier
构造函数中指定了一个服务器(ldap-ad.example.org
) 。您是否尝试过仅指定域而不是服务器(example.org
)?
当您在仅返回0或1个结果的索引属性上搜索时,我真的不明白这两种方法应该如何不同。