Как я могу удалить всех пользователей в группе Active Directory?

Я пытаюсь удалить всех пользователей из группы 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).

Что я нахожу здесь, так это то, что этот код ведет себя неправильно. Он удаляет пользователей, но не после первого запуска. Это делает «некоторые». Потом запускаю еще раз, и еще, и еще - в зависимости от того, сколько пользователей нужно удалить в группе. Я не уверен, почему это работает таким образом.

Может ли кто-нибудь помочь исправить этот код или предоставить альтернативный метод удаления всех пользователей в группе?


person Mike    schedule 08.06.2010    source источник
comment
Синтаксис вашего кода в порядке. Следуйте советам SLaks, и вы должны достичь желаемых результатов.   -  person mcass20    schedule 08.06.2010


Ответы (5)


Ваша проблема в том, что вы считаете вверх... Сначала вы удаляете элемент с индексом 0. Затем каждый оставшийся элемент перемещается в index - 1 в списке. Затем вы удаляете с индексом 1, и каждый оставшийся элемент перемешивается, кроме того, который вы оставили с индексом 0. По сути: вы удаляете только половину элементов.

Вместо цикла for попробуйте while (groupDE.Properties["member"].Count > 0) и каждый раз просто удаляйте элемент с индексом 0.

person Dan Puzey    schedule 08.06.2010

Вы перебираете элементы по мере их удаления, в результате чего индекс пропускает все остальные элементы.

Вам нужно изменить внутренний цикл for на цикл в обратном направлении, например:

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

Или если вы используете

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

Это также будет работать:

groupPrincipal.Members.Clear();
groupPrincipal.Save();
person user1306787    schedule 08.04.2013

просто используйте:

group.Properties["member"].Clear();
group.CommitChanges();
person cosi    schedule 08.08.2012

Эта ссылка в CodeProject должна помочь:

«Как сделать (почти) все в AD: http://www.codeproject.com/KB/system/everythingInAD.aspx

person code4life    schedule 09.06.2010