2010-02-15 57 views
3

以下C#代碼(.NET Framework 3.5)返回AD組「xyz」的所有用戶的名稱和說明。只要它返回少量記錄,它就會很好用。但是,它返回超過100多條記錄時速度很慢。任何建議將非常感激。先謝謝你!System.DirectoryServices.AccountManagement性能問題?

var context = new PrincipalContext(ContextType.Domain); 

var grp = GroupPrincipal.FindByIdentity(context, "xyz"); 

var users = grp.GetMembers(true); 

var usersList = users.Select(n => new { UserName = n.Name, 
             Description = n.Description }) 
         .OrderBy(o => o.UserName.ToString()); 

Console.WriteLine(usersList.ToList()); 

回答

4

執行屬性作用域查詢(ASQ)時,您將獲得更好的性能。下面是一些示例代碼:

DirectoryEntry group = new DirectoryEntry("LDAP://CN=All Staff,OU=Groups,DC=domain,DC=local"); 

DirectorySearcher searcher = new DirectorySearcher(); 
searcher.SearchRoot = group; 
searcher.Filter = 
    "(&(objectClass=user)(objectCategory=person)(mail=*))"; 
searcher.PropertiesToLoad.Add("mail"); 
searcher.SearchScope = SearchScope.Base; 

searcher.AttributeScopeQuery = "member"; 

List<string> mail; 
using (SearchResultCollection results = searcher.FindAll()) 
{ 
    mail = new List<string>(); 
    foreach (SearchResult result in results) 
    { 
     mail.Add(result.Properties["mail"][0].ToString()); 
    } 
} 

一般來說System.DirectoryServices.AccountManagement是要給你比的System.DirectoryServices性能降低。但是,99%的時間你將無法注意到它。然而,在這種情況下,您的示例正在遍歷每個對象,並通過線路進行迭代,而我的示例則利用LDAP代表我們完成所有工作。

請注意,此代碼僅適用於成員少於1000人的羣組。如果你有一個比你更大的組,你需要頁面更復雜的代碼,但沒有什麼大不了的。

+0

非常感謝!當我將grp.GetMembers(true)更改爲grp.GetMembers(false)時,我注意到了改進的性能。我的代碼還返回了所有行而不是前1000個。 – rk1962 2010-04-17 22:41:07