Получить количество членов в группе 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();