Рекурсивный поиск пользователей в группе AD и во всех вложенных группах

На работе мы много имеем дело с отчетной информацией о пользователях и компьютерах в сети, и одна задача, которую мне недавно поручили, связана с рекурсивным отчетом о том, какие пользователи являются частью группы, и обо всех вложенных группах.

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

Процесс

Процесс довольно прост: по имени группы AD найдите всех ее членов. Для каждого из его членов, если это группа, снова вызовите этот метод, в противном случае добавьте член в список.

Междоменные проблемы

SID

К сожалению, все становится немного сложнее, когда у вас есть члены группы, которые находятся в другом домене AD.

Свойство name члена, расположенного в другом домене, будет идентификатором безопасности (SID), а не фактическим именем. Чтобы получить имя, вам нужно использовать этот фрагмент кода:

Собственность участника группы

Когда в группе более 1500 участников, свойство member имеет счетчик, равный 0, и вместо этого заполняется свойство с именем member;range:0–1499.

Это свойство содержит первые 1500 членов, и чтобы получить все элементы, вам нужно продолжать загружать следующее свойство (например, member;range:1500–2999) в цикле for:

Первая часть цикла while генерирует имя свойства и получает члены.

Последняя часть цикла while проверяет, является ли свойствоmembers нулевым, если это так, то мы знаем, что находимся в конце нашего цикла, и чтобы получить эти последние несколько членов, вы используете символ * для обозначения конечного индекса.

Как только вы разберетесь с проблемами междоменного доступа и собственности участников, все остальное будет легко.

Вот пример вывода:

Код

Кодирование с акцентом

Вы, наверное, заметили, что я пишу с акцентом C# при программировании в Powershell. Например. используя [System.IO.File]::ReadAllLines() вместо Get-Content. Есть несколько причин, почему я это делаю:

  • Позже при необходимости проще преобразовать в C#.
  • Он по-прежнему удобочитаем, если не больше, для разработчиков с опытом работы на Java/C#.
  • Командлеты не позволяют увидеть, какой класс используется за кулисами. Если вы знаете этот класс, вы можете найти его в MSDN и увидеть все остальные методы для этого класса.