Технология групповой политики Microsoft не была принята моментально – вначале ее было сложно понять, и требовалось разобраться в службе каталогов Active Directory - странной новой службе, совершенно не похожей на домены Учетных записей/Ресурсов, являвшиеся стандартами в то время. Сегодня групповая политика - это основа управления практически каждой организацией с инфраструктурой Windows®.
Мне кажется, то же самое произойдет и с Windows PowerShell™, самой новой технологией управления от Майкрософт. На самом деле Windows PowerShell наверняка значительно упростит вашу работу в качестве администратора групповой политики.
В этой статье я покажу, как интерфейсы API консоли управления групповой политикой (КУГП/GPMC) Microsoft®, написанные для таких языков WSH, как VBScript (и в целом языков сценариев на основе COM), могут использоваться непосредственно из Windows PowerShell для упрощения управления групповой политикой в вашей среде.
Написание сценариев для задач групповой политики
Когда несколько лет тому назад Майкрософт выпустил GPMC, администраторы групповой политики внезапно получили в свое распоряжение несколько очень удобных функций. В частности, оснастка консоли ММС, посвященная групповой политике, представляла собой большой шаг вперед для управления групповой политикой, в особенности по сравнению со службой каталогов пользователей и компьютеров Active Directory®. Более того, был представлен совершенно новый интерфейс API, позволявший администраторам использовать языки COM, такие как VBScript, для группового администрирования задач, например, копирования и восстановления объектов групповой политики (GPO), переноса объектов GPO между доменами, настройки параметров безопасности для объектов GPO и связей, а также отчетности.
К сожалению GPMC не давала возможности изменять уже настроенные параметры внутри объектов групповой политики. Другими словами, вы могли выполнять операции с содержанием GPO, например читать версии GPO, читать даты изменения, создавать новые объекты GPO, копировать и восстанавливать/импортировать объекты GPO из других доменов и т.д., но вы не могли программно добавлять или изменять содержание GPO, например, добавлять новую перенаправленную папку или новую установку программы. Обычно вместо этого вы создавали объект GPO и настраивали все параметры вручную с использованием редактора объектов групповой политики, затем копировали и импортировали его в тестовую среду. Когда результат проходил проверку, и все работало правильно, вы импортировали объект в рабочую среду. Несмотря на отсутствующую функцию, использование сценариев вместо взаимодействия с интерфейсами API GPMC вручную приводило к огромной экономии времени, усилий, а также снижению количества ошибок в повседневном администрировании групповой политики.
Следующий уровень
Чем Windows PowerShell отличается от языков сценариев, таких как VBScript? Начнем с того, что Windows PowerShell является оболочкой и, по крайней мере для наших целей, вы можете считать оболочку интерпретатором командной строки. Хотя VBScript можно запускать из командной строки, файл VBScript не может запускаться построчно. Сценарий Windows PowerShell, наоборот, может быть создан в процессе работы как серия индивидуальных команд. Кроме того, у Windows PowerShell имеются функции, схожие с процедурами VBScript, которые могут создаваться в реальном времени в командной строке Windows PowerShell.
Более того, Windows PowerShell построена на основе Microsoft .NET Framework, в то время как VBScript основан на устаревшей технологии COM. Это означает, что большое количество кодов .NET, создаваемых сегодня, может быть использовано непосредственно в Windows PowerShell.
Когда речь идет о Windows PowerShell, это означает, что вы получаете полную поддержку сценариев и интерактивный режим, все в одной упаковке. Примеры, которые я приведу здесь, будут вводами командной строки, так что вы сможете печатать во время чтения; тем не менее, они будут работать также хорошо, если вы поместите их в файл сценария Windows PowerShell и запустите его.
Восстановление старых сценариев с использованием Windows PowerShell
При начале работы с новой технологией вы менее всего хотите потерять всю предыдущую работу. Существует три способа, которые можно использовать для получения доступа к объектам COM из интерфейса API GPMC, или, другими словами, вновь использовать имеющиеся там старые VBScirpt. Вы можете выбрать один из этих трех вариантов:
• Создать командлет Windows PowerShell с использованием языка программирования C# или управляемого С++. • Использовать Windows PowerShell для получения доступа к ScriptControl в MSScript.ocx для обертывания старых сценариев. • Обернуть вызовы COM в функции Windows PowerShell для повторного использования или иным способом вызвать объекты COM напрямую.
Я собираюсь подробно остановится на третьем варианте, но давайте быстро разберем другие варианты.
Создание командлета Windows PowerShell
Майкрософт включил в Windows PowerShell большое количество командлетов, позволяющих копировать файлы, форматировать результат, получать дату и время и т.д., но вы также можете создавать ваши собственные командлеты. Эта процедура полностью описана в msdn2.microsoft.com/ms714598.aspx. Вот эта процедура вкратце:
• Создайте библиотеку DLL класса на языке программирования .NET, таком как C#. • Создайте новый класс и унаследуйте от базового класса cmdlet. • Установите характеристики, определяющие имя, использование, входные параметры и т.д. и добавьте ваш код.
Поскольку Windows PowerShell построен на основе .NET Framework, любые типы, такие как строка, объект и т.д., возвращаемые или передаваемые как параметры, будут в коде точно такими же, как и в Windows PowerShell; не требуется специального преобразования типов.
Преимуществом этого решения является то, что в вашем распоряжении имеется полный язык программирования.
Обертывание старых сценариев с использованием объекта ScriptControl в MSScript.ocx
Совершенно очевидно, что для запуска файла VBScript вам необходим обработчик VBScript. Не так очевидно то, что этот обработчик – объект COM, и, поскольку вы можете использовать объекты COM из Windows PowerShell, вы также можете вызвать обработчик VBScript. Вот как это могло бы выглядеть:
Если вы введете этот код в интерфейс командной строки (CLI) Windows PowerShell, будет вызвана функция ShowMessage языка VBScript и исполнена с параметром, в результате чего появится окно сообщения, в котором вы увидите текст «Hello World».
Некоторые из вас могут подумать: «Здорово! Я освоил искусство использования COM из Windows PowerShell, и теперь я могу перестать читать эту статью и начать заполнять объекты ScriptControl моей коллекцией старых сценариев GPMC.» К сожалению, это не так. Этот прием становится очень сложным и трудоемким при отладке по мере того, как сценарии становятся больше.
Обертывание COM объектов
Таким образом, наилучшим вариантом является третий из предложенных: обертывание вызовов COM в функции Windows PowerShell для повторного использования, позволяющий использовать объекты COM в интерфейсе API GPMC. Строка ниже показывает, как создать объект .NET непосредственно в Windows PowerShell. В данном случае это объект FileInfo, который можно использовать для получения размера файла:
$netObject = New-Object System.IO.FileInfo( ”C:\boot.ini”) # Create an instance of FileInfo # representing c:\boot.ini
Обратите внимание, что # используется в Windows PowerShell для встроенных комментариев. Используя этот заново созданный экземпляр объекта FileInfo, вы легко можете получить размер boot.ini простым вводом следующего кода:
$netObject.Length # Display the size in bytes of the # file in the command line interface
Погодите, мы же говорили об объектах COM и преобразовании VBScript? Да, но посмотрите на следующую команду:
Вы должны заметить, что синтаксис практически идентичен тому, который я ранее использовал для создания собственных объектов из .NET Framework, с двумя различиями. Первое из них – добавление переключателя ComObject, направляющего Windows PowerShell через мир COM, а не через мир .NET. Далее, я использую ProgID из COM вместо конструктора .NET, в данном случае Scripting.FileSystemObject. ProgID – это то же самое имя, которое вы всегда использовали. В VBScript эквивалент будет следующим:
Set comFileSystemObject = CreateObject( ”Scripting.FileSystemObject”)
Для получения размера файла с использованием VBScript добавьте вышеприведенную строку в файл вместе со следующим кодом:
Set comFileObject = comFileSystemObject.GetFile( ”C:\Boot.ini”) WScript.Echo comFileObject.Size
Затем запустите его, используя, например, Cscript.exe. В Windows PowerShell вы бы сделали это следующим образом (непосредственно из командной строки Windows PowerShell, если угодно):
Разумеется, для преобразования сценария VBScript, который считывает размер файла, я мог бы использовать командлет Windows PowerShell, который управляет объектами на дисках, но я хотел показать вам, как легко получить доступ к COM из Windows PowerShell. Обратите внимание, что, хотя я приказал Windows PowerShell создать объект COM, созданный объект, в данном случае $comFileSystemObject, является объектом .NET, который обертывает объект COM и открывает доступ к его интерфейсу. В свете этой статьи это, тем не менее, не имеет большого значения.
Windows PowerShell в действии
Теперь, когда вы знаете, как получить доступ к COM из Windows PowerShell, давайте сосредоточимся на групповой политике. Примеры ниже покажут короткие фрагменты кода, чтобы дать вам представление о том, как использовать интерфейсы API GPMC из Windows PowerShell, а полный набор функций Window PowerShell для управления групповой политикой вы сможете найти в кодах для загрузки, относящихся к этой статье, на веб-узле technetmagazine.com/code07.aspx. рис. 1 содержит список всех функций, включенных в эту загрузку.
Специальные функции в материале для загрузки
Во время прочтения этой статьи вы можете открыть командную строку Windows PowerShell и вводить туда команды. Учтите, что некоторые команды зависят от предыдущих команд. Другими словами, некоторые объекты, созданные ранее, будут использоваться позднее, поэтому работайте в одном и том же сеансе Windows PowerShell. Если вы закроете сеанс, вам придется начать все сначала, вводя заново все команды.
Итак, давайте создадим новый объект GPO, используя Windows PowerShell. Команда разработчиков Майкрософт, занимающаяся групповой политикой, включила в GPMC ряд полностью работоспособных примеров VBScript, которыми вы можете воспользоваться для ускорения процесса. Они находятся в каталоге %ProgramFiles%\GPMC\Scripts, в котором вы также можете найти файл под названием gpmc.chm, содержащий всю документацию по интерфейсам API GPMC. Давайте взглянем на сценарий CreateGPO.wsf и проанализируем его, чтобы узнать, как он работает.
У самого верха вы увидите строку:
Dim GPM Set GPM = CreateObject(”GPMgmt.GPM”)
Это исходная точка для любого сеанса или сценария управления групповой политикой, потому что она создает экземпляр класса GPMgmt.GPM, который дает доступ к большинству функций GPMC. Пойдемте дальше и проделаем это из Windows PowerShell:
$gpm = New-Object -ComObject GPMgmt.GPM
Теперь, когда у вас есть исходная точка для управления групповой политикой, следующим шагом будет выяснение того, что вы можете с этим сделать. В обычных случаях вы углубитесь в документацию, чтобы получить такую информацию, но у Windows PowerShell есть одна замечательная способность. Если вы введете следующую строку, вы получите результат, показанный на рис.2:
Рис. 2 Выходные данные Get-Member (Щелкните изображение, чтобы увеличить его)
$gpm | gm
Мне кажется, это просто здорово. Обратите внимание на то, что командлет Get-Member (или gm) позволяет вам видеть свойства и методы, которые поддерживает объект, прямо в командной строке. Это, разумеется, не то же самое, что читать документацию, но это облегчает процесс использования объектов, с которыми вы уже знакомы, если вы не помните точные цифры параметров, точное имя и т.д. Обратите также внимание на то, что когда вы смотрите на списки узлов в документации GPMC, создается впечатление, что это объект GPM, а все другие классы имеют префикс I; это происходит вследствие внутренних процессов COM и не имеет для нас большого значения; это предназначено для программистов на C++, пишущих машинный код COM, и означает разницу между интерфейсом и классом, реализующим его. Также обратите внимание на то, что при использовании интерфейсов API GPMC вам нужно создать только один объект таким образом, и этот объект - GPMgmt.GPM; все другие объекты создаются при помощи методов, которые запускаются вместе с этим объектом GPM.
Продолжим создание нового объекта GPO.
Рис.3 показывает, насколько простым является создание объекта GPO. Хотя я опустил некоторые части кода, включающие обработку ошибок (например, что произойдет в случае, если у вас нет доступа к созданию объектов GPO), и также жестко закодировал имя домена, вы должны получить общее представление.
$gpmConstants = $gpm.GetConstants() # This is the GPMC way to retrieve all # constants $gpmDomain =$gpm.GetDomain(”Mydomain.local”, ””, $gpmConstants.UseAnyDC) # Connects to the domain where the GPO should # be created, replace Mydomain.local with the # name of the domain to connect to. $gpmNewGpo = $gpmDomain.CreateGPO() # Create the GPO $gpmNewGpo.DisplayName = ”My New Windows PowerShell GPO” # Set the name of the GPO
Рис 3.
Теперь, когда вы знаете, как создать объект GPO, давайте откроем существующий объект. У вас все еще есть ссылка на домен, $gpmDomain, поэтому введите следующее:
$gpmExistingGpo = $gpmDomain.GetGPO( ”{31B2F340-016D-11D2-945F-00C04FB984F9}”) # Open an existing GPO based on its GUID, # in this case the Default Domain Policy. $gpmExistingGpo.DisplayName # Show the display name of the GPO, it # should say Default Domain Policy $gpmExistingGpo.GenerateReportToFile($gpmConstants.ReportHTML, ”.\DefaultDomainPolicyReport.html”
Вы получите полный отчет в формате HTML о параметрах политики домена по умолчанию, но вы можете использовать любой из методов и свойств, например, ModificationTime, который сообщит вам, когда объект GPO в последний раз изменялся, чтобы узнать, когда изменялись какие-либо из параметров объекта GPO.
Это чрезвычайно полезно. Наверняка вы не раз были в ситуации, когда телефоны разрывались от звонков пользователей, жалующихся на то, что их компьютеры ведут себя странно. Вы полагаете, что это имеет отношение к изменениям, дополнениям или уничтожению параметров GPO, но вы понятия не имеете, к какому объекту GPO это относится. Вам на помощь придет Windows PowerShell! Если вы введете сценарий, показанный на рис.4, в командную строку Windows PowerShell, вы получите список всех объектов GPO, которые изменялись за последние 24 часа.
$gpmSearchCriteria = $gpm.CreateSearchCriteria() # We want all GPOs so no search criteria will be specified $gpmAllGpos = $gpmDomain.SearchGPOs($gpmSearchCriteria) # Find all GPOs in the domain foreach ($gpmGpo in $gpmAllGpos) { if ($gpmGpo.ModificationTime -ge (get-date).AddDays(-1)) {$gpmGpo.DisplayName} # Check if the GPO has been modified less than 24 hours from now }
Рис 4.
Обратите внимание на знак операции –ge, означающий «больше или равно». Он может показаться вам странной, если вы привыкли к знакам операций "и" в других языках написания сценариев или программирования. Однако эти знаки операций используются для перенаправления, например, для перенаправления выходных данных в файл, и поэтому не могут использоваться в качестве знаков операций сравнения в Windows PowerShell.
Краткое заключение
Код на рис.5 содержит полный сценарий для копирования параметров из одного объекта GPO в другой объект GPO. Теперь вы должны получить представление о том, как вы можете использовать новую технологию для групповой политики, а также о том, как повторно использовать какой-либо объект COM или код на VBScript, использующий объект COM.
Рис 5. Копирование параметров из одного объекта GPO в другой объект GPO (Щелкните изображение, чтобы увеличить его)
Windows PowerShell станет естественной частью любой среды управления Windows, также как ею уже является групповая политика. Однако существуют миллионы строк VBScript, которые необходимо переносить или поддерживать, и я надеюсь, что это руководство поможет вам в этом.
Существует большое количество источников, которые вы можете использовать для улучшения администрирования групповой политики и других областей, в которых вы ранее использовали VBScript, включая функции Windows PowerShell в разделе загрузки, а также руководство по преобразованию VBScript в Windows PowerShell на веб-узле TechNet, помогающее выполнять обычные задачи в Windows PowerShell, если вы знакомы с эквивалентами на VBScript. Эту информацию вы найдете на веб-узле microsoft.com/technet/scriptcenter/topics/winpsh/convert.
Кроме того, существует полная документация по интерфейсу API GPMC, которую вы можете загрузить с веб-узла групповой политики microsoft.com/grouppolicy.
И последнее – если вы еще не установили Windows PowerShell, чего вы ждете? Загрузите его с microsoft.com/powershell. Желаю удачи.
Торбьорн Сьоволд (Thorbjцrn Sjцvold) является главным техническим директором и создателем специальных эксплуатационных программ (www.specopssoft.com), а также поставщиком дополнительных программ по системному управлению и безопасности на основе групповой политики. С ним можно связаться по адресу thorbjorn.sjovold@specopssoft.com.