2010-02-15 96 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