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