В апреле 2003 г. компания Microsoft выпустила консоль управления групповыми политиками (Group Policy Management Console — GPMC), которая обеспечивает пользователю удобный интерфейс управления групповыми политиками Windows Server 2003 и Windows 2000 на базе Microsoft Management Console (MMC). Функции управления объектами групповой политики (GPO) консоли GPMC — значительный шаг вперед по сравнению со встроенными инструментами Windows 2000. С помощью встроенных средств трудно составлять сценарии для управления GPO, а в состав GPMC входит набор сценарных интерфейсов для автоматизации многих типовых задач управления GPO. С помощью этих интерфейсов можно управлять средой Group Policy, в том числе генерировать отчеты о параметрах GPO, создавать GPO, копировать их и находить несвязанные объекты. Компания Microsoft подготовила несколько сценариев GPMC, охватывающих многие типовые задачи. Администраторы также могут составлять собственные специализированные сценарии управления GPO.

С помощью GPMC можно управлять групповыми политиками в доменах Windows 2000, но работает консоль только на компьютерах Windows 2003 и Windows XP Professional. GPMC можно загрузить из Microsoft Download Center (http://www.microsoft.com/downloads/ details.aspx?familyid=f39e9d60-7e41-4947-82f5-3330f37adfeb&displaylang=en). В процессе установки GPMC система создает папку с именем Scripts, в которой содержатся все готовые сценарии GPMC. В Windows 2003 или XP эта папка находится в каталоге %programfiles%gpmc. Основные административные сценарии имеют расширение .wsf. Этот формат ассоциирован с Windows Script Host (WSH). Сценарии с расширением .wsf представляют собой файлы в формате XML и могут вызывать другие сценарии, составленные на языках VBScript и JScript. Следовательно, в одном сценарии можно задействовать механизмы сценариев как VBScript, так и JScript. В данной статье для сценариев использовался VBScript, без применения .wsf-файлов.

Интерфейсы GPMC реализованы в файле gpmgmt.dll, который находится в каталоге %programfiles%gpmc. Эти интерфейсы предназначены как для управления объектами GPO, так и для автоматизации функций GPMC. Таким образом, интерфейсы можно использовать не только для подготовки сценариев таких операций GPMC, как построение таблиц преобразования для миграции GPO, но и для формирования запросов и изменения GPO. Однако интерфейсы GPMC не позволяют прочитать или настроить параметры политики внутри GPO. Например, нельзя составить сценарий, который активизирует готовую административную политику Remove Run from Start Menu внутри GPO. Это досадное ограничение, но тем не менее интерфейсы GPMC обеспечивают уровень автоматизации, превосходящий возможности прежних инструментов. Остановимся более подробно на том, как приступить к работе со сценариями GPMC и как использовать объекты GPMC для решения различных административных задач, например выборки информации о разрешениях GPO и отчетах Resultant Set of Policies (RSoP).

Приступаем к подготовке сценария GPMC

Составлять сценарии GPMC довольно просто. Подготовка любого сценария GPMC состоит из одних и тех же основных этапов. Как и для большинства новых объектов в среде WSH, в первую очередь необходимо создать экземпляры нужных объектов. Во всех сценариях GPMC первым создается экземпляр объекта GPM. Этот объект представляет собой корневой объект объектной модели GPMC. Объект GPM должен обращаться к другим интерфейсам GPMC, которые в свою очередь обеспечивают доступ к дополнительной функциональности. Например, нужно, чтобы объект GPM обращался к интерфейсу IGPMDomain, который позволяет создать ссылку на домен Active Directory (AD). Получив ссылку на домен AD, можно вызвать метод GetGPO интерфейса IGPMDomain, чтобы обратиться к интерфейсу IGPMDomain и создать ссылку на конкретный GPO, которым предстоит управлять. Теперь интерфейс IGPMGPO содержит методы и свойства для управления этим GPO. Более подробные сведения об объектной модели GPMC приведены в Help-файле gpmc.chm в папке Scripts. Кроме того, объектная модель описана в документе Group Policy Management Console Reference по адресу http://msdn.microsoft.com/library/ default.asp?url=/library/en-us/gpmc/gpmc/ group_policy_management_console_reference.asp в сети MSDN.

Полезен также интерфейс IGPMConstants, который играет особую роль в подготовке сценария GPMC. Данный интерфейс располагает набором свойств, которые представляют связанные с GPO константы, часто используемые в сценариях GPMC. Например, если необходимо назначить разрешения, которые определяют лиц, имеющих право редактировать GPO, то разрешение Edit можно представить в виде сложного набора списков управления доступом (ACL) файловой системы и AD. Однако такой подход требует больших усилий, связанных с подготовкой программного кода, поэтому вся работа возложена на интерфейс IGPMConstants. Можно просто вызвать свойство PermGPOEdit интерфейса IGPMConstants, которое будет представлять соответствующее разрешение. Для доступа к интерфейсу IGPMConstants применяется метод GetConstants объекта GPM. Получив ссылку на объект GPMConstants с помощью метода GetConstants, можно использовать любое свойство GPMConstants в сценариях.

В Листинге 1 приведен исходный текст для создания объектов GPM и GPMConstants. На примере двух сценариев — GetGPOPerms.vbs и RSoPLogging.vbs — видно, как можно применить данный программный код. Конечно, эти сценарии — не самые простые. Я не хотел воспроизводить сценарии GPMC, предоставленные Microsoft.

Извлечение разрешений GPO

Сценарий в Листинге 2, GetGPOPerms.vbs, показывает, как использовать несколько объектов GPMC, чтобы составить список разрешений для GPO в тестовом домене. GetGPOPerms.vbs начинается с создания экземпляров объектов GPM и GPMConstants. Затем сценарий обращается к IGPMDomain, полезному интерфейсу, через который можно получить информацию о домене и управлять объектами GPO внутри него. Получить доступ к IGPMDomain можно с помощью метода GetDomain объекта GPM, который возвращает объект GPMDomain. Как видно из фрагмента A в Листинге 2, метод GetDomain принимает три аргумента. Первый аргумент — имя домена, в котором хранятся управляемые объекты GPO. Именем домена должно быть имя DNS (например, mycompany.net). Как видно из фрагмента A, значение аргумента можно жестко задать в сценарии. Возможен другой подход, при котором пользователи сценария вводят имя домена в командной строке при запуске сценария.

Второй аргумент указывает, какой контроллер домена будет применяться для соединения с доменом. Пустая строка («») указывает, что предпочтительный домен не выбран и метод GetDomain будет использовать контроллер — эмулятор PDC. В качестве третьего аргумента указывается вариант поиска DC, с которым будет установлено соединение. Существует три варианта: GPM_USE_ANYDC (использовать любой доступный DC), GPM_USE_PDC (использовать эмулятор PDC) и GPM_DONOTUSE_W2KDC (использовать DC Windows 2003). Как видно из фрагмента A, в сценарии GetGPOPerms.vbs с помощью свойства UseAnyDC объекта GPMConstants выбран вариант GPM_USE_ANYDC.

После того как соединение с доменом установлено, начинается самое интересное. Как видно из фрагмента B в Листинге 2, метод GetGPO объекта GPMDomain извлекает объект GPMGPO, представляющий GPO, для которого нужно получить список разрешений. Чтобы воспользоваться GetGPOPerms.vbs, необходимо заменить имя домена mycompany.net именем DNS конкретного домена AD. Следует обратить внимание, что аргумент метода GetGPO есть глобально уникальный идентификатор GUID объекта GPO, а не дружественное имя GPO. В данном сценарии используется GUID для политики Default Domain Policy, которая имеется в каждом домене AD. Этот GUID одинаков для всех доменов AD.

Пользователи сценария без труда введут в командную строку необходимую информацию о GPO, но вряд ли разумно требовать от них вручную набирать GUID. Альтернативный вариант — ввод пользователем дружественных имен GPO; затем можно получить соответствующие GUID с помощью функции GetGPObyName, которая хранится в файле lib_commongpmcfunctions.js в папке Scripts. GetGPObyName использует интерфейс IGPMSearchCriteria для поиска всех GPO в домене и, обнаружив имя, совпадающее с введенным пользователем дружественным именем, возвращает GUID, который сценарий передает в GetGPO. Однако GetGPObyName — функция JScript. Сторонники VBScript могут подготовить VBScript-версию функции GetGPObyName или использовать методы GetGPOs, GPOName и GPOGuid COM-объекта IADsTools, который входит в состав пакета Windows 2000 Support Tools.

Затем сценарий использует метод GetSecurityInfo объекта GPMGPO, чтобы извлечь разрешения GPO. Метод GetSecurityInfo возвращает ссылку на объект-набор GPMSecurityInfo, который сценарий назначает переменной GPOSec. Объект GPMSecurityInfo содержит набор разрешений, предоставленных GPO. Затем сценарий проходит по набору, подсчитывает и возвращает число записей о разрешениях, используя для этого свойство Count объекта GPMSecurityInfo.

Для считывания каждого разрешения в сценарии применяется свойство Item объекта GPMSecurityInfo, которое возвращает ссылку на объект GPMPermission. После того как сценарий назначает эту ссылку переменной Ace, сценарий обращается к объекту GPMTrustee с помощью свойства Trustee объекта GPMPermission. Вызывая свойство Trustee объекта GPMPermission, сценарий определяет имя пользователя или группы, присвоенное текущему разрешению, а затем назначает это имя переменной PrincipalName.

Исходный текст фрагмента C в Листинге 2 использует оператор Select Case, чтобы определить разрешения, назначенные данному пользователю или группе. Объект GPO может иметь пять различных разрешений, определенных в интерфейсе IGPMConstants. Эти пять разрешений хранятся в операторе Select Case.

Первая строка оператора Select Case заставляет механизм этапа исполнения VBScript сравнить значение Ace.Permission (значение свойства Permission объекта GPMPermission) с каждым из вариантов. Когда значение свойства Permission совпадает с одним из пяти разрешений, сценарий формирует понятное для пользователя описание данного разрешения переменной Perm. И наконец, сценарий использует WSH-команду WScript.Echo, чтобы вывести имя пользователя или группы и разрешение на экран консоли.

Создание отчетов RsoP

Полезная функция GPMC — возможность протоколировать и планировать Group Policy. Через интерфейсы GPMC можно программным путем получить результаты сеансов протоколирования и планирования Group Policy. Например, чтобы получить результаты сеанса протоколирования Group Policy, следует воспользоваться провайдером RSoP Windows Management Instrumentation (WMI).

В сценарии RSoPLogging.vbs (см. Листинг 3) показано, как выполнить запрос протоколирования и создать отчет в HTML-формате через интерфейсы RSoP. Первые несколько строк сценария создают объекты GPM и GPMConstants. Затем сценарий использует метод GetRSOP объекта GPM, чтобы создать экземпляр объекта GPMRSOP. Данный метод принимает три параметра, первый из которых определяет режим RSoP. Как видно из исходного текста фрагмента A в Листинге 3, один из способов обеспечить этот режим — воспользоваться свойством RSOPModeLogging объекта GPMConstants. В сеансе планирования RSoP следует применить вместо него свойство RSOPModePlanning. Второй параметр задает путь к пространству имен WMI, в котором находятся прежние данные RSoP. В данном случае параметр представляет собой пустую строку, так как прежних данных не существует. Последний параметр всегда равен 0.

После того как будет создан экземпляр объекта GPMRSOP, сценарий назначает два свойства — LoggingComputer и LoggingUser объекта GPMRSOP — для запроса протоколирования RSoP. Свойство LoggingComputer указывает имя целевой машины (в данном случае myworkstation), а свойство LoggingUser указывает имя целевого пользователя (в данном случае Darren). Затем сценарий выполняет запрос протоколирования, вызывая метод CreateQueryResults объекта GPMRSOP, который не имеет параметров.

Наконец, сценарий вызывает метод GenerateReportToFile объекта GPMRSOP, для которого следует указать тип генерируемого отчета (HTML или XML). Чтобы выбрать отчет HTML, применяется свойство ReportHTML объекта Constants. Если нужен отчет в формате XML, то вместо свойства ReportHTML следует использовать свойство ReportXML. Второй параметр указывает полный путь к отчету.

Метод GenerateReportToFile может передать ссылку на объект GPMResult. Объект GPMResult имеет два свойства — Result и Status, с помощью которых можно определить, когда подготовка отчета была завершена или закончилась неудачей. Однако генерация отчета — последняя задача в сценарии RSoPLogging.vbs, поэтому нет необходимости определять, когда закончилась подготовка отчета. Отчет готов, когда завершается выполнение сценария, поэтому сценарий ссылку на GPMResult не сохраняет.

Новые возможности GPMC

Новые интерфейсы GPMC отличаются чрезвычайной гибкостью, мощностью и довольно хорошо документированы. Они обеспечивают более полный контроль над инфраструктурой Group Policy, чем встроенный инструментарий Windows 2000. Построив специализированные сценарии и используя их совместно с готовыми сценариями Microsoft, можно автоматизировать большинство задач управления GPO.

Даррен Мар-Элиа - редактор журнала Windows & NET Magazine. С ним можно связаться по адресу: dmarelia@winnetmag.net.