C# LDAP与AD的连接非常慢,超时

C# LDAP与AD的连接非常慢,超时,c#,active-directory,ldap,C#,Active Directory,Ldap,我试图从两个不同的来源收集数据:一个AD域和一个LDAP服务器 下面是我正在使用的代码: switch (dir) { case 0: searchFilter = String.Format("(&(objectClass=user)(employeeID={0}))", lineData[34]); attr = new st

我试图从两个不同的来源收集数据:一个AD域和一个LDAP服务器

下面是我正在使用的代码:

            switch (dir)
            {
                case 0:
                    searchFilter = String.Format("(&(objectClass=user)(employeeID={0}))", lineData[34]);
                    attr = new string[] { "sn", "givenName", "l", "employeeid", "sAMAccountName" };
                    uid_ATTR = "sAMAccountName";
                    eid_ATTR = "EmployeeID";
                    dirName = "AD";
                    sr = new SearchRequest(adBaseDN, searchFilter, System.DirectoryServices.Protocols.SearchScope.Subtree, attr);
                    break;
                case 1:
                    searchFilter = String.Format("(employeeNumber={0})", lineData[34]);
                    attr = new string[] { "sn", "givenName", "uid", "l", "employeeNumber" };
                    uid_ATTR = "uid";
                    eid_ATTR = "employeeNumber";
                    dirName = "LDAP";
                    sr = new SearchRequest(ldapBaseDN, searchFilter, System.DirectoryServices.Protocols.SearchScope.Subtree, attr);
                    break;
                default:
                    WriteLog("Incorrect call to CompareDirectory(). Appropriate values are 0 or 1");
                    return;
            }

            try
            {
                if (dir == 0) { result = adConx.SendRequest(sr) as SearchResponse; }
                else { result = ldapConx.SendRequest(sr) as SearchResponse; }
                if (result != null)
                { .... etc.
LDAP搜索速度非常快,只需几毫秒即可返回结果。然而,广告搜索速度相当慢,需要5到11秒才能返回结果

此时,我不确定这是我的筛选器问题还是AD问题。Wireshark快速跟踪显示以下内容,看起来像是超时:

我愿意接受任何建议

提前谢谢

编辑:
我决定使用localhost:389作为LDAP连接地址,直接在域控制器上运行代码,进一步测试这一点。代码仍然需要大约8-10秒才能返回响应。这实际上可能是一个广告问题,而不是代码问题。

这与Active Directory中设计非常糟糕的OU结构有关。

您使用的是Active Directory server 2008及更高版本吗?如果没有,请注意
objectClass
属性没有索引->带有以
objectClass
的条件开头的过滤器的搜索查询将很慢。而且,
objectclass=user
objectcategory=person
是相互包容的。唯一的区别是
objectCategory=person
还包括
contact
类。根据您的需要,您可以安全地省略其中的一个或另一个。此外,我建议在最具体的条件是第一个的情况下使用ldap筛选器,因此如果您有实际要查找的employeeID,请将该条件作为第一个条件放在查询中:
(&(employeeID={0})(objectcategory=person)(objectClass=user))
谢谢@ShadowWalker;我们使用的是2008 R2,所以应该为objectClass编制索引。然而,在过滤器中是否有对象类并没有区别。查询仍在5到11秒之间运行。我开始怀疑这是否是一个网络或广告问题,特别是因为搜索结果的响应非常快,但随后对话就超时了。我对广告服务器响应的方式和时间没有那么深入的了解,因此我无法在这方面提供帮助。但是,如果可能的话,您可以尝试从与AD服务器连接到同一本地子网的计算机上进行查询。然而,我强烈怀疑这是网络相关的,而不是ldap/AD相关的。。。或者,也许广告服务器的搜索请求太多了。@ShadowWalker,我想你可能是对的。我将尝试使用环回接口直接在DC上运行它。改进东西。分数并不重要