2013-07-05 29 views
1

我使用下面的查詢在AD帶回一個用戶的郵件地址:LDAP查詢帶回一個計算機對象

// get a DirectorySearcher object 
     DirectorySearcher search = new DirectorySearcher(); 

     // specify the search filter 
     search.Filter = "(&(objectClass=user)(anr=" + login + "))"; 

     // specify which property values to return in the search 
     search.PropertiesToLoad.Add("mail");  // smtp mail address 

     // perform the search 
     SearchResult result = search.FindOne(); 

     if (result != null) 
     { 

      return result.Properties["mail"][0].ToString(); 
     } 
     else 
     { 

      return null; 
     } 

對於誰是登錄特定的用戶是「SRB」查詢正在帶回一個名爲「SRB-PC」的計算機對象。

我不明白爲什麼作爲過濾器說objectClass應該是「用戶」。

此外 - 爲什麼它將它帶回來,因爲它是一個「喜歡」的查詢 - 我希望它只帶回名稱完全匹配過濾器的對象。

回答

2

A Computer對象是Active Directory中的User對象的子。這就是爲什麼你找到你的原始搜索計算機的原因。

objectCategory元素被用來區分正常的實體: -

Object Class vs. Object Category頁指出:

之前的Windows Server 2008中,對象類屬性不被索引。這是因爲它有多個值並且非常不唯一;也就是說,objectClass屬性的每個實例都包含頂級類。這意味着指數將非常大而且無效。要查找給定類的對象,請使用單值和索引的objectCategory屬性。有關在搜索過濾器中使用這些屬性的更多信息,請參閱決定要查找的內容。

因此,使用objectCategory而不是objectClass進行搜索會更高效。

1

OK - 切換過濾器:

search.Filter = string.Format("(&(objectCategory=Person)(anr={0}))", login); 

真的不明白爲什麼它固定它,但它確實!

1

你會做得很好使用的東西,如:

(&(objectCategory=person)(objectClass=user)) 
or 
    (sAMAccountType=805306368) 

看到一些other MS queries