0
我正试图从两个单独的数据源收集数据:AD域和LDAP服务器。到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的痕迹显示出下面的,看起来像一个超时:
我愿意接受任何建议的。
在此先感谢!
编辑: 我决定通过使用本地主机上的域控制器直接运行的代码进一步测试此一个步骤:389作为LDAP连接地址。代码仍然需要大约8-10秒才能返回响应。这实际上可能是AD问题,而不是代码问题。
您使用的是Active Directory服务器2008及更高版本吗?如果不是,那么请注意'objectClass'属性是**而不是**索引 - >一个带有以'objectClass'条件开始的过滤器的搜索查询将会很慢。另外,'objectclass = user'和'objectcategory = person'是相互包含的。唯一不同的是,通过'objectCategory = person'你也可以包含'contact'类。根据您的需要,您可以放心地省略其中一个或另一个。 –
此外,我建议使用ldap过滤器,其中最具体的条件是第一,所以如果你有一个实际的employeeID你正在寻找,把这个条件作为第一个查询:'(&(employeeID = {0} )(objectcategory = person)(objectClass = user))' –
Thanks @ShadowWalker;我们使用的是2008 R2,所以objectClass应该被索引。但是,不管我在过滤器中是否有对象类,都没有区别。查询仍在5到11秒之间运行。我开始怀疑这可能是网络还是广告问题,尤其是因为搜索结果响应速度非常快,但会话结束后才会超时。 – vermi