2010-06-08 7 views
3

J'essaie de supprimer tous les utilisateurs d'un groupe AD avec le code suivant:Comment puis-je supprimer tous les utilisateurs d'un groupe 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(); 
      }    
     }  
    }  

Le rootRefreshDir est le répertoire qui contient tous les groupes AD (childDir).

Ce que je trouve ici est que ce code ne se comporte pas correctement. Il supprime les utilisateurs, mais il ne le fait pas après la première exécution. Ça fait "un peu". Ensuite, je l'exécute à nouveau, et encore, et encore - en fonction du nombre d'utilisateurs doivent être supprimés dans un groupe. Je ne sais pas pourquoi cela fonctionne de cette façon.

Quelqu'un peut-il aider à corriger ce code ou fournir une méthode alternative pour supprimer tous les utilisateurs d'un groupe?

+1

Votre syntaxe de code est correcte. Suivez les conseils de SLaks et vous devriez atteindre les résultats souhaités. – mcass20

Répondre

4

Votre problème est que vous comptez vers le haut ... Vous devez d'abord supprimer un élément à l'index 0. Chaque élément restant passe ensuite à index - 1 dans la liste. Vous supprimez ensuite à l'index 1, et tous les éléments restants mélangent sauf pour celui que vous avez maintenant laissé à l'index 0. Fondamentalement: vous supprimez seulement la moitié des éléments.

Au lieu d'une boucle for, essayez while (groupDE.Properties["member"].Count > 0) et supprimez simplement l'élément à l'index 0 chaque fois.

5

Vous parcourez les éléments lorsque vous les supprimez, ce qui fait que l'index ignore tous les autres éléments.

Vous devez changer la boucle for intérieure en boucle arrière, comme ceci:

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

utilisez simplement:

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

Ou si vous utilisez

DirectoryServices.AccountManagement.GroupPrincipal (.NET 3.5+):

Cela fonctionnera également:

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