2010-06-08 147 views
3

我試圖從AD組用下面的代碼刪除所有用戶:如何刪除Active Directory組中的所有用戶?

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是包含所有廣告組(childDir)的目錄。

我在這裏找到的是,這段代碼行爲不正確。它會刪除用戶,但不會在第一次運行後執行。它確實「有些」。然後我再次運行它,並再次運行 - 取決於組中有多少用戶需要刪除。我不確定它爲什麼以這種方式運作。

有人可以幫助修復此代碼或提供一種替代方法來刪除組中的所有用戶?

+1

你的代碼語法沒問題。按照SLaks的建議,你應該達到你想要的結果。 – mcass20 2010-06-08 15:55:06

回答

4

您的問題是你向上計數......你先在索引爲0的每個剩餘項目中刪除項目然後移至列表中的index - 1。然後你在索引1刪除,剩下的每個項目都洗牌,除了爲你現在在索引0處留下的那個。基本上:你只能刪除一半的項目。

而不是for循環,嘗試while (groupDE.Properties["member"].Count > 0),並且每次只刪除索引0處的項目。

5

您在刪除項目時循環瀏覽項目,導致索引跳過其他所有項目。

您需要更改內部for循環依次向後,就像這樣:

PropertyValueCollection members = groupDE.Properties["member"]; 
for (int counter = members.Count - 1; counter >= 0; counter--) { 
    members.RemoveAt(counter); 
    groupDE.CommitChanges(); 
    groupDE.Close(); 
} 
2

只需使用:

group.Properties["member"].Clear(); 
group.CommitChanges(); 
4

或者,如果你正在使用

(.NET 3.5+):

這也可以工作:

groupPrincipal.Members.Clear(); 
groupPrincipal.Save();