System.DirectoryServices.AccountManagement性能问题?

时间:2010-02-15 02:53:16

标签: .net c#-3.0 active-directory asp.net-3.5

以下C#代码(.NET Framework 3.5)返回AD组“xyz”的所有用户的名称和描述。只要它返回少量记录,它就能很好地工作。但是,当它返回超过100条记录时,它非常慢。任何建议都会受到高度赞赏。提前谢谢!

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());

1 个答案:

答案 0 :(得分: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的组。如果你有一个大于你的组,你需要页面,这是更复杂的代码,但没有什么大不了的。