Рекурсивный поиск пользователей в группе 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 и увидеть все остальные методы для этого класса.