Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: MikeОтветов: 5

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

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

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

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

active-directory

Ответы

Ответ 1 · рейтинг 4 · Dan Puzey

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

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

Ответ 2 · рейтинг 5 · SLaks

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

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

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

Ответ 3 · рейтинг 4 · user1306787

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

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

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

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

Ответ 4 · рейтинг 3 · cosi

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

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

Ответ 5 · code4life

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы