2016-01-29 5 views
1

ENV: Visual Studio 2013, рамочные 4,5, Telerik Controls, C#, WebForm приложениеПолучить Количество пользователей в группы AD с помощью PrincipalSearcher

Использование: System.DirectoryServices и System.DirectoryServices.AccountManagement

Я m, создавая инструменты поиска, чтобы пользователь мог искать имя активной группы каталогов в нескольких лесах/доменах.

Поиск возвращает список из 1 или более групп, и я помещаю этот список в RadGrid (Telerik). Каждая строка сетки представляет собой группу AD. Я хотел бы отобразить дополнительную информацию, которая показывает пользователю, сколько (счетчиков) членов (пользователей) есть в этой группе.

private List<AdGroup> GetListOfGroupAD(string domain, string name, string samAccountName) 
    { 
     try 
     { 
      GroupPrincipal qbeGroup; 
      using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain)) 
      { 
       qbeGroup = new GroupPrincipal(ctx); 
       qbeGroup.Name = !string.IsNullOrEmpty(name) ? name : "*"; 
       qbeGroup.SamAccountName = !string.IsNullOrEmpty(samAccountName) ? samAccountName : "*"; 
       PrincipalSearcher srch = new PrincipalSearcher(qbeGroup); 
       ((DirectorySearcher)srch.GetUnderlyingSearcher()).PageSize = 500; 

       List<AdGroup> listeGroupe = srch.FindAll() 
             .OrderBy(x => x.SamAccountName) 
             .Select(x => new AdGroup() 
             { 
              SamAccountName = x.SamAccountName, 
              Description = x.Description, 
              Domain = domain, 
              NbMember = 0 //Can i Get a count of members in group here ????? 
             }) 
             .ToList(); 
       return listeGroupe; 
      } 
     } 
     catch (ArgumentNullException ex) 
     { 
      writeToLog(ex.Message, 1); 
      return null; 
     } 
     catch (Exception ex) 
     { 
      writeToLog(ex.Message, 1); 
      return null; 
     } 
    } 

public class AdGroup 
    { 
     public string SamAccountName { get; set; } 
     public string Description { get; set; } 
     public string Domain { get; set; } 
     public int NbMember { get; set; } 
    } 

Спасибо за помощь

Ричард

ответ

1

Один подход заключается, чтобы определить тип результата поиска в GroupPrincipal с помощью .OfType() после вызова FindAll(), а затем вы можете получить член каждой группы в виде коллекции с использованием свойства коллекции Members или метода GetMembers(), который имеет необязательный логический аргумент, чтобы указать, нужно ли вам рекурсивно искать группу для вложенных элементов. В этот момент получите размер коллекции.

List<AdGroup> listeGroupe = srch.FindAll() 
    .OfType<GroupPrincipal>() 
    .OrderBy(x => x.SamAccountName) 
    .Select(x => new AdGroup() 
    { 
     SamAccountName = x.SamAccountName, 
     Description = x.Description, 
     Domain = domain, 
     NbMember = x.Members.Count 
    }) 
    .ToList(); 
+0

Спасибо, я попробовал ваше предложение, но я получаю это исключение. «При попытке разрешить ссылку на перекрестный магазин целевого принципала не удалось найти в домене, указанном SID принципала». : Это означает, что член группы может не быть частью домена из реального контекста? – Richard

+0

Да, эта ошибка предполагает, что член одной из ваших групп в вашем домене имеет недопустимый SID. – Chase