当前位置 : 主页 > 大数据 > 区块链 >

active-directory – 使用DirectoryServices.Protocols进行LDAP搜索的速度很慢

来源:互联网 收集:自由互联 发布时间:2021-06-22
我们使用System.DirectoryServices.DirectorySearcher来执行sAMAccountName查找.这种方法很好,除了在查询某个AD时,我们怀疑它非常大,搜索通常会超时.在做了一些研究之后,我发现在查询大型AD时,使用
我们使用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

上面的代码工作,因为它返回一个结果,但比原来慢得多.我怀疑我试图查询的方式效率低下但是我不太确定如何设置它以便它更快.

我遇到了同样的问题,最终导致System.DirectoryServices.Protocols.LdapConnection.SendRequest方法中返回结果中的“引用追逐”.这是由于“假”域名“corp.org”没有任何DNS条目(因此SendRequest浪费了大量时间对结果进行DNS查找).要禁用引荐追踪:

var conn = new LdapConnection(...);
conn.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
网友评论