Отримання списку членів вкладених груп, Windows IT Pro

Однією з переваг Active Directory (AD) над Windows NT у тому, що AD підтримує складне вкладення груп. Вкладені групи забезпечують гнучкість у розробці структури груп та застосування списків контролю доступу ACL до ресурсів. Ця можливість стає доступною відразу після того, як ви зміните функціональний рівень домену AD до Windows Server 2003 або домен Windows 2000 переведете в однорідний режим.

Проходимо крізь нетрі вкладених груп

Атрибути групи

Щоб проілюструвати вкладеність груп, припустимо, що структура груп подібна до ієрархії факультету в університеті. Кожен із класів відділення - це група, що складається зі студентів цього класу. Усі разом групи класів становлять групу факультету. Нарешті група факультету є членом групи курсу університету. Подібна структура вкладених груп забезпечує гнучкість у присвоєнні прав доступу до ресурсів, таких як загальні аудиторії для всього курсу та до спеціальних аудиторій, доступних лише студентам певних класів.

Групові об'єкти AD мають два атрибути, що мають відношення до членства в групах. Один із таких атрибутів зберігає посилання на об'єкти, які є прямими членами групи. Інший атрибут memberOf зберігає посилання на інші групи. до яких належить ця група.

Використання сценарію

Тепер, коли ви маєте атрибути груп, скористаємося сценарієм, який перераховує членів вкладених груп. На Лістингу 1 представлений код сценарію enum_groups.vbs, який виводить членів вкладених груп як ієрархічного списку. Щоб отримати такий вид списку, вам необхідно скористатися сервером сценаріїв CScript Windows Script Host (WSH) для запуску enum_groups.vbs.

Длявикористання сценарію скопіюйте його в локальну папку на вашому комп'ютері та виконайте таку команду:

визначає членів групи Engineering school та здійснює виведення списку на екран, показаний на Рисунку 1.

списку

Малюнок 1 Виведення результатів сценарієм enum_groups.vbs

Отримання інформації про групи з AD

У сценарії enum_groups.vbs код фрагмента A, представлений на Лістингу 1 показує визначення того, список членів якої групи необхідно отримати. Щоб дізнатися, чи вводив користувач будь-які параметри під час запуску сценарію, сценарій створює об'єкт WScript.Arguments, який забезпечує доступ до всіх аргументів командного рядка. Якщо кількість аргументів, введених при запуску сценарію не дорівнює 1, сценарій вважає, що користувач не поставив жодних аргументів, або задав їх занадто багато.

У цьому випадку сценарій виконує незалежну від сервера прив'язку до об'єкта RootDSE. Процес DCLocator автоматично прив'язується до контролера домену (DC) домену, в якому користувач запускає сценарій. Потім сценарій конструює (відтворює) повне ім'я DN групи Domain Admins отже якщо хтось запускає сценарій без визначення того, список членів яких груп необхідно отримати, сценарій буде робити хоч якусь операцію. Коли користувач вводить хоча б один параметр, сценарій поміщає цей параметр змінну strGroupDN.

Код фрагмента B починає створювати об'єкт Dictionary VBScript з ім'ям dicSeenGroupMember. Сценарій використовує об'єкт dictionary для відстеження груп, які вже показані з метою запобігання зациклювання у відображенні вкладених груп. Кругове вкладення груп відбувається у тих випадках, коли ви маєте цикл у ланцюжку членства в групах. Наприклад, якщо група groupA єчленом групи groupB, а група groupB є членом групи groupC, а groupC є, своєю чергою, членом групи groupA. В описаному випадку ми маємо цикл у ланцюжку членства у групах. Кругове вкладення груп необов'язково є шкідливим явищем. Просто це необхідно мати на увазі під час роботи з вкладеними групами.

Функція DisplayMembers

Фрагмент сценарію C містить основний корисний код функції DisplayMembers. DisplayMembers є рекурсивною функцією, що перераховує членів групи. Потім функція викликає сама себе пошуку тих членів групи, які є групами. Після цього DisplayMembers починає виконання циклу For Each. Next. Цикл здійснює ітерацію всім членам групи, шляхом виклику методу Members кожного члена. Тільки об'єкти IADsGroup мають метод Members. Якщо ADsPath не належить до об'єктів типу групи, сценарій зупинить свою роботу на першому рядку циклу. Якщо ADsPath містить шлях до групи, сценарій поверне об'єкт IADsMember для кожного члена групи

Всередині циклу enum_groups.vbs спочатку використовує метод Get для відновлення повного імені об'єкта DN і потім виводить його на екран. У цій точці сценарію другий параметр DisplayMembers, що задає кількість прогалин, входить у гру. Оскільки я хочу, щоб сценарій показував ієрархію вкладених груп, сценарій виводить прогалини перед тим, як вивести ім'я члена групи. Пізніше, коли DisplayMembers викликає сам себе, він збільшує кількість пробілів виділення кожного рівня в ієрархії членів.

Потім enum_groups.vbs, використовуючи метод Class, перевіряє тип класу об'єкта member. Для груп метод Class повертає значення group. Це означає, що виявлено вкладені групи і що сценарію доведеться переглядати та виводити інформацію про членів вкладених.груп. Однак перед тим, як enum_groups.vbs почне перерахування членів вкладеної групи, сценарію необхідно переконатися, що він ще не зчитував цю групу. Я не хочу, щоб сценарій зчитував інформацію про групу більше одного разу, щоб запобігти появі нескінченних циклів з причин, описаних раніше. Для визначення того, чи вже зчитана інформація по групі, enum_groups.vbs перевіряє, чи є ім'я цієї групи в об'єкті - словнику dictionary. Якщо там ця група відсутня, сценарій починає перерахування її об'єктів.

Під час перерахування складу групи, enum_groups.vbs насамперед додає ім'я цієї групи в об'єкт dictionary для того, щоб сценарій не переглядав цю групу знову. Потім сценарій знову викликає DisplayMembers, й у гру входить рекурсивний алгоритм. Пам'ятайте, що першим параметром DisplayMembers є ADsPath - шлях AD до групи, що перераховується. Цей параметр сценарій отримує за допомогою методу AdsPath. Другим параметром DisplayMembers є кількість пробілів, які використовуються для виділення вкладених груп під час відображення. Сценарій додає два пробіли до ідентифікатора вкладеної групи. Останній із параметрів - це копія об'єкта Dictionary.

Це все, що я хотів сказати про enum_groups.vbs. Рекурсія в цьому сценарії працює з тієї причини, що сценарієм відстежуються групи, які вже перераховані та викликає DisplayMembers тільки для груп, які ще не перераховувалися. За допомогою рекурсивної функції завжди потрібно мати критерій виходу з операції. У сценарії enum_groups.vbs як такий критерій виступає об'єкт dictionary.