При установке оснастки Group Policy Management Console (GPMC) консоли Microsoft Management Console (MMC) в Windows Server 2003 устанавливается несколько объектов COM, поддерживающих автоматизацию работы с помощью сценариев. При этом открывается масса новых возможностей, связанных с манипулированием объектами групповой политики (GPO) службы Active Directory (AD). Я уже рассказывал о том, как, основываясь на этих возможностях, использовать объекты GPM для добавления или удаления разрешений групповых политик Read и Apply для участников групп безопасности (security principals) на такие объекты AD как GPO, диапазон управления (Scope of Management – SOM) и фильтры WMI (Windows Management Instrumentation). Для того чтобы устанавливать на эти объекты разрешения Set или Custom, необходимо, как и ранее, использовать программные инструменты ADSI (Active Directory Service Interfaces), такие как IADsSecurityDescriptor или библиотека Microsoft adssecurity.dll.

Установка разрешений на GPO

Знакомство с объектами GPM мы начнем с установки с их помощью разрешений на список контроля доступа (ACL) объекта GPO, который определяет, какие пользователи и компьютеры имеют разрешения на применение (apply) данного GPO. Возможность использования объектов GPM для назначения разрешений групповой политики Read и Apply в соответствии с членством в группах безопасности может оказаться весьма полезной. Предположим, что группе безопасности, содержащей несколько компьютеров некоторого организационного подразделения (OU) из вашего домена, требуется предоставить разрешения на доступ к объекту GPO, привязанному к данному OU. При этом предполагается, что в настоящий момент указанные компьютеры не имеют доступа к этому объекту GPO. В Листинге 1 приведен сценарий SettingGPOPermissions.vbs, который создает новый набор разрешений Read и Apply на групповую политику, подключается к заданному GPO, удаляет разрешения, имеющиеся у группы в данный момент (включая те, которые запрещают ей доступ к данному GPO), и назначает указанной группе новый набор разрешений доступа.

Во фрагменте кода с меткой A (Листинг 1) определяется ряд констант, значения которых потребуется изменить в соответствии с требованиями конкретной среды: глобально уникальный идентификатор GPO (GUID), имя домена и группа безопасности. Далее в сценарии выполняется подключение к заданному домену и GPO, и формируются ссылки на константы объекта GPM.

После этого с помощью метода CreatePermission объекта GPM создаются новые разрешения доступа, причем я рекомендую всегда использовать этот метод в сценариях, работающих с GPM, при создании объектов разрешений доступа для GPO, SOM и фильтров WMI. Данный метод использует три параметра. Первый параметр определяет субъект доверия (trustee) (пользователь, компьютер или группа в AD, которой назначаются разрешения). Второй параметр описывает назначаемые разрешения, для чего используются определенные константы, имена которых начинаются с префикса Perm. Третий параметр представляет собой булево значение, определяющее, должен ли дочерний объект (например, вложенное OU) наследовать назначаемые разрешения. В данном случае сценарий SettingGPOPermissions.vbs считывает имя субъекта доверия (группа GROUP), константу, описывающую разрешения Read и Apply на групповую политику (PermGPOApply) и булево значение TRUE (указывающее на то, что дочерний объект должен наследовать назначаемые разрешения).

Затем с помощью метода GetSecurityInfo объекта GPMGPO извлекается существующая коллекция GPMSecurityInfo. Данная коллекция может содержать много различных разрешений, поэтому здесь необходимо не просто вставить новую коллекцию, а удалить и заменить только интересующие нас разрешения. Для удаления назначенных группе разрешений в сценарии используется метод RemoveTrustee объекта GPMSecurityInfo, которому просто передается имя SAM (в виде домен/группа) соответствующей группы. Если по каким-либо причинам вы не хотите использовать для группы имя SAM – например, в том случае, когда нужно удалить из GPO все субъекты доверия – тогда можно вместо имени SAM использовать уникальный идентификатор UID соответствующего субъекта доверия. Сначала считывается значение trustee из объекта GPMPermission с помощью метода Trustee данного объекта, затем для извлечения уникального значения SID объекта доверия используется свойство TrusteeSid результирующего объекта GPMTrustee. В данном случае фрагмент, отмеченный в Листинге 1 меткой B, необходимо заменить следующим кодом:

strSID = 
gpmPerm.Trustee.TrusteeSid
gpmSecInfo.RemoveTrustee strSID

Что касается метода TrusteeName объекта GPMTrustee, то его невозможно использовать аналогичным образом, поскольку данный метод не возвращает имя в формате SAM.

Далее с помощью метода Add объекта GPMSecurityInfo новые установленные разрешения добавляются в коллекцию, а завершается данная операция применением метода SetSecurityInfo объекта GPMGPO, который фиксирует внесенные в коллекцию изменения применительно к требуемому объекту GPO.

Сценарий можно изменить таким образом, чтобы с помощью метода CreatePermission объекта GPM можно было предоставлять разрешения доступа только на чтение (Read), разрешения чтения (Read) и редактирования (Edit) настроек групповой политики в GPO либо предоставить разрешения на изменение (Modify) разрешений для объекта GPO (т.е. можно делегировать административные разрешения через сценарии). Если использовать эти возможности в сочетании с теми, что были описаны мною ранее и касались организации поиска объектов GPO в домене, можно сначала выполнять поиск заданных объектов GPO, а потом сразу устанавливать для них требуемые разрешения.

Установка разрешений на диапазоны SOM и фильтры WMI

С помощью объектов GPM можно устанавливать шесть типов разрешений для SOM и два – для фильтров WMI. Более подробная информация о SOM приведена в статье "Управление объектами групповой политики с помощью сценариев" (http://www.osp.ru/win2000/2006/05/3154185/), фильтры WMI рассматриваются во врезке "Фильтры WMI". Константы разрешений (permission constants) SOM позволяют субъектам доверия осуществлять привязку объектов GPO к диапазонам SOM для формирования результирующего набора политик (Resultant Set of Policies –RSoP), обеспечивая регистрацию либо планирование данных для OU или доменов, иметь полный контроль над доменом через фильтры WMI либо создавать фильтры WMI и объекты GPO для всего домена. Установка разрешений для фильтров WMI позволяет изменять либо приобретать полный контроль над этими фильтрами. Чтобы устанавливать разрешения на эти объекты, можно воспользоваться методикой, показанной в Листинге 1, нужно всего лишь соответствующим образом изменить значения констант разрешений в объекте GPMConstants.

Как показано во врезке "Фильтры WMI", одним из возможных вариантов применений этих фильтров является ситуация, когда необходимо определить, установлено ли в системе то или иное исправление. Предположим, что имеется несколько компьютеров с Windows XP, на которых планируется провести обновление программного обеспечения, но для этого сначала необходимо установить некоторое исправление. В данном случае можно, используя ADSI, создать фильтр WMI, с помощью которого определить, на каких системах установлено интересующее нас исправление, после чего с помощью сценария, подобного SetWMIFilterAndPermissions.vbs, показанному в Листинге 2, установить этот фильтр и применить политику GPO, запускающую установку обновления программного обеспечения на тех компьютерах, на которых установлено требуемое исправление. Сценарий также добавляет разрешения, позволяющие членам заданной группы безопасности редактировать данный фильтр WMI.

Обратите внимание, что константы GPO_PATH и WMIFILTER здесь отображаются в виде нескольких строк, однако в действительности каждая из них должна записываться одной строкой. Информация о GPO размещается в двух местах: данные о конфигурации групповых политик (Group Policy Configuration) хранятся в AD, а ключевые данные о шаблонах групповых политик (Group Policy Template) существуют в виде файлов и каталогов и находятся в системном разделе (SYSVOL). В нашем случае мы будем манипулировать данными AD. Данные обо всех объектах GPO размещаются в AD в одной папке и упорядочены в соответствии с идентификаторами GUID. Путь к этим данным в формате протокола Lightweight Directory Access Protocol (LDAP) определяет константа GPO_PATH. Константа WMIFILTER содержит строку описания фильтра WMI.

Установка фильтра WMI реализуется достаточно просто. С помощью вызова метода GetObject, использующего путь LDAP, определяемый константой GPO_PATH, осуществляется подключение к соответствующему объекту GPO в AD. Далее используется имеющийся в ADSI метод IADs::Put, с помощью которого устанавливается необходимое строковое значение свойства gPCWQLFilter, а затем вызовом метода IADs::SetInfo результаты записываются в AD.

Далее сценарий обращается к объекту GPMWMIFilter, для чего используется метод GetWMIFilter объекта GPMGPO, затем с помощью метода GetSecurityInfo объекта GPMWMIFilter извлекается информация о правах доступа для данного объекта. После этого для заданной группы создается разрешение Edit. Это осуществляется путем обращения к свойству CreatePermission объекта GPM, которому в качестве параметра передается значение свойства PermWMIFilterEdit объекта GPMConstant. При этом для соответствующего GPO сценарий сначала удаляет разрешения, существующие у данного субъекта (в нашем случае это группа GROUP), а затем устанавливает для него новые разрешения, которые заносятся в коллекцию GPMSecurityInfo. В конце сценария вызывается метод SetSecurityInfo объекта GPMWMIFilter, с помощью которого модифицированная коллекция GPMSecurityInfo заносится обратно в фильтр WMI.

При использовании методов GetSecurityInfo и SetSecurityInfo применительно к объектам GPMWMIFilter, GPMGPO и GPMSOM во всех случаях происходит извлечение коллекций данных о правах доступа и манипулирование ими, однако необходимо понимать, что эти коллекции значительно отличаются друг от друга. Не стоит беспокоиться по поводу того, что сценарий сначала удаляет разрешения, а потом назначает их, а не наоборот. Код, осуществляющий удаление разрешений, делает это только для заданного субъекта, поэтому при добавлении новых разрешений для него мы можем начать "с чистого листа".

Время экспериментировать

Я надеюсь, что данный цикл статей послужит для читателей отправной точкой в создании сценариев управления групповыми политиками через объекты GPM COM. Кроме того, призываю всех регулярно заглядывать в Microsoft Developer Network (MSDN) и экспериментировать с приведенной там информацией.


Фильтры WMI

Компания Microsoft добавила в службу Active Directory (AD) Windows Server 2003 новую мощную технологию фильтрации GPO, которая называется фильтрация WMI (Windows Management Instrumentation). С помощью этой технологии можно ассоциировать запрос WMI с объектом GPO, в результате чего данный запрос будет выполняться для каждого пользователя или компьютера, на которые распространяется данная политика GPO. Фильтр WMI может проверять наличие какого-либо фрагмента WMI-данных, к которым клиентский компьютер имеет разрешения доступа на целевой системе, включая аппаратные средства компьютера и конфигурацию, пользовательские профили и параметры среды. Этот новый фильтр дает нам прекрасную возможность назначения GPO определенным типам клиентов. Фильтры WMI содержат запросы на языке WMI Query Language (WQL), которые операционная система обрабатывает динамически при загрузке компьютера или при регистрации пользователя в системе. В зависимости от результатов выполнения этих запросов операционная система применяет либо игнорирует настройки, определяемые соответствующим объектом GPO.

Фильтры WMI могут применяться в различных ситуациях, например для выявления клиентов, подключающихся к сети через RAS либо для определения, установлен ли на клиенте тот или иной пакет обновления или программное исправление. Однако следует учитывать, что фильтры WMI имеют ряд ограничений. Внутри запросов WQL нельзя использовать операции связывания (join), поэтому с помощью этих запросов можно получать информацию о значениях свойств только тех объектов WMI, которые относятся к одному и тому же классу. Например, в одном запросе может определяться версия операционной системы (свойство класса Win32_OperatingSystem) либо объем свободного дискового пространства (свойство класса Win32_LogicalDisk), но не оба эти значения одновременно.

Фильтр WMI состоит из двух частей, разделенных символом точка с запятой (;). Первая часть представляет собой описание пространства имен, в котором размещаются объекты того класса, к которому вы обращаетесь в данном запросе. Вторая часть фильтра - это сам запрос WQL, результаты выполнения которого будут использоваться для применения соответствующего объекта GPO. Например, если требуется определить, установлено ли в системе исправление Q987654, можно обратиться к WMI-классу Win32_QuickFixEngineering, который находится в пространстве имен RootCIMV2. В этом случае фильтр WMI, извлекающий необходимую информацию, будет выглядеть следующим образом:

RootCimV2; SELECT * FROM Win32_QuickFixEngineering WHERE HotfixID = "Q987654"


Листинг 1. SettingGPOPermissions.vbs
'BEGIN CALLOUT A
Const GUID = "{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}"
Const DOMAIN = "mydomain.mycorp.com"
Const GROUP = "mydomainmygroup"
'END CALLOUT A
 
Dim gpm, gpmDomain, gpmGPO, gpmSecInfo
Dim gpmConstants, gpmPerm
 
Set gpm = CreateObject("GPMGMT.GPM")
Set gpmDomain = gpm.GetDomain (DOMAIN, "", 0)
Set gpmGPO = gpmDomain.GetGPO (GUID)
Set gpmConstants = gpm.GetConstants
 
BEGIN COMMENT
'Создание разрешений Read и Apply
' на групповую политику для группы.
END COMMENT
Set gpmPerm = gpm.CreatePermission(GROUP, gpmConstants.PermGPOApply, TRUE) 
BEGIN COMMENT
'Получение информации обо всех разрешениях для данного GPO.
END COMMENT
Set gpmSecInfo = gpmGPO.GetSecurityInfo()
 
BEGIN COMMENT
'Удаление существующих разрешений для заданной группы.
END COMMENT
'BEGIN CALLOUT B
gpmSecInfo.RemoveTrustee GROUP
'END CALLOUT B
 
BEGIN COMMENT
'Назначение группе новых разрешений 
' и фиксация внесенных изменений.
END COMMENT
gpmSecInfo.Add gpmPerm
gpmGPO.SetSecurityInfo gpmSecInfo

ЛИСТИНГ 2. SetWMIFilterAndPermissions.vbs
Const GUID = "{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}"
Const DOMAIN = "mydomain.mycorp.com"
Const GROUP = "mydomainmygroup"
 
'BEGIN CALLOUT A
GPO_PATH = "LDAP://cn=" & GUID & ",cn=Policies,cn=System,cn=mydomain,cn=mycorp,cn=com"
WMIFILTER = "RootCimV2; SELECT * FROM " _
      & "Win32_QuickFixEngineering WHERE HotfixID = ""Q987654"""
'END CALLOUT A
 
Dim gpm, gpmDomain, gpmGPO, gpmSecInfo, GPO_PATH
Dim gpmConstants, gpmPerm, objGPO, gpmWMIFilter, WMIFILTER
 
Set gpm = CreateObject("GPMGMT.GPM")
Set gpmDomain = gpm.GetDomain (DOMAIN, "", 0)
Set gpmGPO = gpmDomain.GetGPO (GUID)
Set gpmConstants = gpm.GetConstants
BEGIN COMMENT
'Установка фильтра WMI.
END COMMENT
Set objGPO = GetObject(GPO_PATH)
objGPO.Put "gPCWQLFilter", strWMIFilter
objGPO.SetInfo
BEGIN COMMENT
'Получение информации о правах для фильтра WMI.
END COMMENT
gpmWMIFilter = gpmGPO.GetWMIFilter
Set gpmSecInfo = gpmWMIFilter.GetSecurityInfo()
BEGIN COMMENT
'Создание разрешения Edit для заданной группы.
END COMMENT
Set gpmPerm = gpm.CreatePermission(GROUP, gpmConstants.PermWMIFilterEdit, TRUE)
BEGIN COMMENT
'Удаление разрешений, существующих у группы.
END COMMENT
gpmSecInfo.RemoveTrustee GROUP
BEGIN COMMENT
'Назначение группе новых разрешений 
' и фиксация внесенных изменений.
END COMMENT
gpmSecInfo.Add gpmPerm
gpmWMIFilter.SetSecurityInfo gpmSecInfo