System.DirectoryServices.AccountManagement Проблема производительности? - PullRequest
3 голосов
/ 15 февраля 2010

Следующий код 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 Ответ

4 голосов
/ 03 марта 2010

Вы получите лучшую производительность при выполнении запроса области атрибутов (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 участников. Если у вас есть группа, которая больше этой, вам понадобится страница, которая представляет собой более сложный код, но не имеет большого значения.

...