.net System.DirectoryServices.AccountManagement性能问题?

.net System.DirectoryServices.AccountManagement性能问题?,.net,c#-3.0,active-directory,asp.net-3.5,.net,C# 3.0,Active Directory,Asp.net 3.5,以下C#代码(.NET Framework 3.5)返回广告组“xyz”的所有用户的名称和说明。只要返回几个记录,它就工作得很好。但是,当它返回100多条记录时,速度非常慢。如有任何建议,将不胜感激。提前谢谢你 var context = new PrincipalContext(ContextType.Domain); var grp = GroupPrincipal.FindByIdentity(context, "xyz"); var users = grp.GetMembers(tr

以下C#代码(.NET Framework 3.5)返回广告组“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());

执行属性范围查询(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());
   }
}
DirectoryEntry group=newdirectoryentry(“LDAP://CN=All Staff,OU=Groups,DC=domain,DC=local”);
DirectorySearcher search=新的DirectorySearcher();
searcher.SearchRoot=组;
搜索者。过滤器=
“(&(objectClass=user)(objectCategory=person)(mail=*)”;
searcher.PropertiesToLoad.Add(“邮件”);
searcher.SearchScope=SearchScope.Base;
searcher.AttributeScopeQuery=“成员”;
列表邮件;
使用(SearchResultCollection results=searcher.FindAll())
{
邮件=新列表();
foreach(搜索结果中的搜索结果)
{
mail.Add(result.Properties[“mail”][0].ToString());
}
}
一般来说,System.DirectoryServices.AccountManagement的性能将低于System.DirectoryServices。然而,99%的时候你不会注意到它。然而,在本例中,您的示例迭代每个对象并将其拉过连接,而我的示例利用LDAP代表我们完成所有工作


请注意,此代码仅适用于成员少于1000的组。如果您有一个比这更大的组,您将需要页面,这是更复杂的代码,但不是什么大问题。

非常感谢!当我将grp.GetMembers(true)更改为grp.GetMembers(false)时,我注意到性能有所提高。我的代码还返回了所有行,而不是前1000行。