2013-01-02 41 views
3

我有一個包含所有AD用戶名(超過1,500個)的列表,並且我想知道檢索包含在其中的所有用戶的電子郵件地址的最佳方法該清單。從Active Directory中檢索包含電子郵件地址的C#列表

具體來說,我可以調用並提供一個用戶名列表並讓該方法返回一個包含初始列表中提供的所有用戶名的電子郵件地址的相同大小的列表。

我已經知道如何使用傳統的LDAP方式檢索電子郵件地址,如http://lozanotek.com/blog/articles/149.aspx所示,我知道我可以使用一個Foreach,但是我正在尋找一種更有效的方式來檢索超過1,500個電子郵件地址而不需要查詢AD超過1500次。

回答

2

嘿,我一直在尋找相同的,這個工作對我來說:http://forums.asp.net/t/1610245.aspx/1

+0

雖然在forums.asp.net代碼看起來很好 - 請提供一些代碼,看看在[常見問題解答部分(http://stackoverflow.com/faq#deletion)有關鏈接只回答 –

+0

感謝您的寶貴意見@PilgerstorferFranz ...一定會做到這一點,感謝很多。 – Srinivas

+0

+1。 –

0

在你的鏈接使用方法,你將不會被查詢AD 1500次,你會運行一個查詢,返回所有1500個用戶爲對象。然後使用foreach循環,您可以遍歷每個對象以獲取用戶的電子郵件。

,將查詢AD 1500次會,如果你有所有用戶名的ArrayList並做了以下(僞代碼)的一個例子:

ArrayList UserNames = new ArrayList(); 
Foreach(string name in UserNames) 
{ 
    //Query AD to get email of user by passing in name 
} 

的一種方式,使這個快將加多線程並讓每個線程同時處理對AD的不同查詢。例如,您可以將篩選器添加到您的查詢中,以便它只返回以A開頭並具有一個線程句柄的名稱,而另一個處理以B開頭的名稱等等。這將需要更多的查詢到AD(26,1爲字母表中的每個字母),但您可以並行處理返回的數據。

除非你有真正的舊域控制器,否則我不會擔心難以實現AD,而是爲此做好了準備。我將所有的AD(用戶,組,計算機和它們之間的關係)都緩存到數據庫中,我們有超過8000個用戶。我這樣做是因爲對AD的調用往往很慢,我們希望通過網頁提供組成員信息,而無需用戶永久等待。這種緩存可以使數千個AD撥打一分鐘,這並不影響我公司在3小時運行期間的工作流程。

更新:
對不起,我快速閱讀了您的問題,並錯過了您嘗試使用所有名稱列表的方法。你可以像我之前說過的那樣使用多線程方法,但是要將每個用戶名傳遞給不同的線程(限制線程的數量,以便它不會失去控制!!)或者使用一個查詢來獲取所有用戶並檢查它們是否存在於您的列表中的foreach循環中。通過使用二叉樹或其他已排序集合輕鬆遍歷列表,查看用戶是否存在應該相當快。您也可以從列表中刪除用戶,因爲他們被發現後續搜索速度更快。

0

我已經使用了下面的代碼,但現在我意識到這是Srinivas正在討論的代碼。

DirectoryEntry entry = new DirectoryEntry("LDAP://YourDomain"); 
DirectorySearcher dSearch = new DirectorySearcher(entry); 
dSearch.Filter = "(objectClass=user)"; 
foreach (SearchResult sResultSet in dSearch.FindAll()) 
{ 
    if (sResultSet.Properties["mail"].Count > 0) 
     Response.Write(sResultSet.Properties["mail"][0].ToString() + "<br/>"); 
} 
相關問題