Я хочу создать простое приложение, которое показывает рекурсивное членство в группах, но не пользователей, а групп. Поэтому, если groupA имеет groupB в качестве члена, а groupB имеет groupC в качестве члена, я хочу, чтобы код показывал мне все группы, вложенные до последней.
Вот образец с тем, что у меня есть:
if (member.Any())
{
List<string> tempGroup = new List<string>();
do
{
tempGroup.Clear();
foreach (object nestedGroup in member)
{
SearchResult NestedGroupMemberResult = null;
try
{
string NestedgroupMemberSearchFilter = "(&(objectClass=group)(distinguishedName=" + nestedGroup.ToString() + "))";
string NestedgroupMemberPropertise = "member,distinguishedName";
NestedGroupMemberResult = dirSearcher(NestedgroupMemberSearchFilter, NestedgroupMemberPropertise);
}
catch { }
if(NestedGroupMemberResult.Properties["member"].Count > 0)
{
foreach (object NestedGroupMember in NestedGroupMemberResult.Properties["member"])
{
member.Add(NestedGroupMember.ToString());
tempGroup.Add(NestedGroupMember.ToString());
}
}
}
} while (!tempGroup.Any());
}
listBox1.DataSource = member;
По сути, член - это список, который содержит членов группы из входной группы. Допустим, я изначально поставил GroupA, и у него есть члены как GroupB и GroupC, и оба будут в списке участников. Теперь я хотел бы, чтобы этот цикл выполнялся ... пока он ищет каждого члена входной группы, используя примененный фильтр LDAP, и, если он найдет какую-либо группу, добавит его в список членов и список временных групп, поэтому каждый раз, когда есть вложенная группа, список членов будет обновляться и в то же время он будет включен в цикл foreach. Если приложение обнаружит, что вложенных групп больше нет, список временных групп будет пуст и цикл прекратится.
Однако я постоянно получаю сообщение об ошибке "System.InvalidOperationException: 'Коллекция была изменена; операция перечисления может не выполняться.'" Для
foreach (object nestedGroup in member)
И я думаю, что я не могу изменить список членов, пока цикл повторяется по нему. У меня был очень похожий цикл в powershell, который прекрасно работает, но я хотел иметь приложение на c #, так как знаю, что оно может быть намного быстрее при таких поисках.