【问题标题】:LDAP Connection to AD Very Slow, Timing OutLDAP 连接到 AD 非常慢,超时
【发布时间】:2019-02-19 01:22:04
【问题描述】:

我正在尝试从两个不同的来源收集数据: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 搜索速度非常快,只需几毫秒即可返回结果。但是,AD 搜索非常慢,需要 5 到 11 秒才能返回结果。

目前,我不确定这是我的过滤器的问题,还是 AD 的问题。快速的 Wireshark 跟踪显示如下,看起来像超时:

我愿意接受任何建议。

提前致谢!

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

【问题讨论】:

  • 您使用的是 Active Directory server 2008 及更高版本吗?如果没有,请注意objectClass 属性 被索引-> 带有以objectClass 条件开头的过滤器的搜索查询会很慢。此外,objectclass=userobjectcategory=person 是相互包含的。唯一的区别是objectCategory=person 还包括contact 类。您可以放心地省略一个或另一个,具体取决于您的需要。
  • 另外,我建议在最具体的条件最先出现的情况下使用 ldap 过滤器,因此如果您有实际要查找的员工 ID,请将该条件作为查询中的第一个条件:@987654329 @
  • 感谢@ShadowWalker;我们使用的是 2008 R2,所以 objectClass 应该被索引。但是,无论我在过滤器中是否有对象类,都没有区别。查询仍在 5 到 11 秒之间运行。我开始怀疑这是否可能是网络或广告问题,特别是因为搜索结果响应很快,但对话最终超时。
  • 我对 AD 服务器响应的方式和时间没有那么深入的了解,因此我无法在这件事上提供帮助。但是,如果可能,尝试从连接到与 AD 服务器相同的本地子网的计算机进行查询可能对您有益。但是,我强烈怀疑这是与网络相关的,而不是与 ldap/AD 相关的......或者,也许 AD 服务器因搜索请求而过载。
  • @ShadowWalker,我认为您可能是对的。我将尝试使用环回接口直接在 DC 上运行它。

标签: c# active-directory ldap


【解决方案1】:

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

【讨论】:

  • 改进的东西。分数无关紧要
猜你喜欢
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多