我正在尝试使用以下代码从AD组中删除所有用户:
private void RemoveStudents() {
foreach (DirectoryEntry childDir in rootRefreshDir.Children) {
DirectoryEntry groupDE = new DirectoryEntry(childDir.Path);
for (int counter = 0; counter < groupDE.Properties["member"].Count; counter++) {
groupDE.Properties["member"].Remove(groupDE.Properties["member"][counter]);
groupDE.CommitChanges();
groupDE.Close();
}
}
}
rootRefreshDir是包含所有AD组(childDir)的目录。
我在这里发现的是这段代码行为不正确。它会删除用户,但在第一次运行后却不会执行此操作。它确实“有些”。然后我再次运行它,并再次运行 - 取决于组中需要删除多少用户。我不确定它为什么会这样运作。
有人可以帮助修复此代码或提供删除组中所有用户的替代方法吗?
答案 0 :(得分:5)
您在删除项目时循环浏览项目,导致索引跳过其他所有项目。
您需要将内部for
循环更改为向后循环,如下所示:
PropertyValueCollection members = groupDE.Properties["member"];
for (int counter = members.Count - 1; counter >= 0; counter--) {
members.RemoveAt(counter);
groupDE.CommitChanges();
groupDE.Close();
}
答案 1 :(得分:4)
你的问题是你向上计数......你首先删除索引0处的项目。然后每个剩余的项目移动到列表中的index - 1
。然后,您在索引1处删除,并且每个剩余项目将除之外的其他项目改为您现在在索引0处留下的项目。基本上:您只删除了一半的项目。
而不是for
循环,请尝试while (groupDE.Properties["member"].Count > 0)
,并且每次只删除索引0
处的项目。
答案 2 :(得分:4)
或者如果您正在使用
DirectoryServices.AccountManagement.GroupPrincipal
(.NET 3.5 +):
这也可行:
groupPrincipal.Members.Clear();
groupPrincipal.Save();
答案 3 :(得分:2)
只需使用:
group.Properties["member"].Clear();
group.CommitChanges();
答案 4 :(得分:0)
CodeProject中的这个引用应该有所帮助:
“如何做(几乎)AD中的所有事情: http://www.codeproject.com/KB/system/everythingInAD.aspx