Получить количество членов в группе AD с использованием PrincipalSearcher

Env: Visual Studio 2013, FrameWork 4.5, Telerik Controls, C#, приложение WebForm

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

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

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

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();
Другие вопросы по тегам