我想创建一个简单的应用程序来显示递归组成员资格,但不是用户而是组。因此,如果 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,两者都将在成员列表中。现在我希望循环 do..while 使用应用的 LDAP 过滤器搜索输入组的每个成员,如果找到任何组,则将其添加到成员列表和临时组列表中,因此每次有嵌套组时,成员列表都会被更新,同时它将被包含在 foreach 循环中。如果应用程序发现没有更多的嵌套组,则 tempGroup 列表将为空并且循环将停止。
但是我不断收到错误“System.InvalidOperationException:‘集合已修改;枚举操作可能无法执行。’”对于
foreach (object nestedGroup in member)
而且我想当 for 循环遍历它时我不能修改成员列表。我在 powershell 中有非常相似的循环,效果很好,但我想要一个 c# 应用程序,因为我知道它在此类搜索中可以更快。
最佳答案
不要修改您正在使用 foreach
枚举的集合。相反,您可以收集所有必须修改的内容:
List<Object> addMembers = new List<Object>();
foreach (object nestedGroup in member)
{
// ...
foreach (object NestedGroupMember in NestedGroupMemberResult.Properties["member"])
{
addMembers.Add(NestedGroupMember.ToString());
//...
}
}
// ...
}
addMembers.ForEach(member.Add);
关于C# do..while 循环列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53316272/