Помню, как мы работали на персональных компьютерах в 80-е годы: все операции выполнялись в черном и как будто обнесенном стеной окне командной строки DOS, и в него нужно было вводить с клавиатуры различные команды. Потом появилась Windows и графический интерфейс пользователя. Казалось, что командная строка навсегда осталась в прошлом — в первую очередь для пользователей Windows. Но вот недавно разработчики корпорации Microsoft решили, что называется, вернуться к основам. Небольшая группа специалистов создала инструментальное средство PowerShell, сочетающее простоту использования командной строки, мощь механизма манипуляции объектами, простые и в то же время универсальные команды cmdlet и возможность обращаться к классам Microsoft .NET.
Сами по себе установка и запуск PowerShell интереса не представляют, поскольку большинство пользователей начинают работу с команд Dir или Cls, известных еще со времен DOS. Но инструмент PowerShell — как знаменитый швейцарский армейский нож: он позволяет решать сложные проблемы невероятно просто. Чтобы проиллюстрировать эти возможности, мы займемся решением нелегкой административной задачи — управлением и архивированием объектов групповых политик (Group Policy Objects, GPOs), перечисленных в электронной таблице Microsoft Excel.
Я покажу, как просто эта задача решается в среде PowerShell — с использованием всего лишь нескольких строк кода. Я выбрал такой сценарий потому, что практически в каждой компании, где мне довелось побывать, вне зависимости от того, пользуются ли ее сотрудники средствами управления GPO от независимых поставщиков или разработанной корпорацией Microsoft консолью управления Group Policy Management Console (GPMC), скорее всего, все они работают со списком объектов GPO (содержащим также сведения о состоянии этих объектов, о внесенных в них изменениях, о владельцах и т. д.), который хранится в электронной таблице Excel.
Шаг 1. Загрузите и установите консоль GPMC и PowerShell
Продукт GPMC фактически стал стандартом консоли управления для просмотра, архивирования и анализа объектов GPO в каталоге Active Directory (AD). Обращаться к пользовательскому интерфейсу GPMC консоли MMC (Microsoft Management Console) мы не будем, однако в нашем сценарии PowerShell нам потребуется DLL COM-автоматизации для вызова интерфейсов программирования.
GPMC поставляется только с Windows Vista. Тем, кто работает под другими версиями, нужно будет загрузить GPMC со страницы http://www.microsoft.com/windowsserver2003/gpmc . Достаточно установить файл GPMC.msi, после чего регистрация COM будет выполнена автоматически и объекты будут доступны из среды PowerShell.
Теперь загрузите версию PowerShell для своей операционной системы. PowerShell можно получить в Internet по адресу http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx . Отметим, что PowerShell функционирует в средах Windows XP SP2, Windows Server 2003 и Vista — как на 32-разрядной, так и на 64-разрядной платформе. Перед тем как приступать к установке PowerShell, следует убедиться, что на системе установлена библиотека Microsoft .NET Framework 2.0. Версию для платформы x86 можно загрузить по адресу http://www.microsoft.com/downloads/details.aspx?familyid=0856eacb-4362-4b0d-8edd-aab15c5e04f5&displaylang=en (на этой странице есть ссылки и на другие платформы).
Шаг 2. Создайте электронную таблицу с образцами GPO
Почти все администраторы в той или иной форме документируют объекты GPO: в электронной таблице Excel, в базе данных или просто в файле редактора Notepad. Если ранее вы не документировали GPO, сейчас самое время этим заняться.
Как показано на экране 1, я использовал четыре объекта GPO. В электронной таблице Excel описываются конкретные атрибуты каждого объекта, такие как GPOName, GPOGUID, Domain, Owner, Department, Change Control status и Description. Требуется составить список GPO, представленных в каталоге AD, или создать в этом каталоге тестовые GPO для данного упражнения, а также обновить столбцы GPOName, GPOGUID и Domain с использованием собственных GPO, которые предстоит зарезервировать. Завершив заполнение электронной таблицы Excel, сохраните ее в виде файла со значениями, разделенными запятыми (файл CSV), с именем GPOList.csv. В среде PowerShell имеются встроенные команды, позволяющие импортировать содержимое файлов .csv и перемещаться по отдельным элементам внутри электронной таблицы как по объектам. В этом состоит ключевое отличие PowerShell от типичных оболочек UNIX или от других языков сценариев, таких как Perl. Если оболочки UNIX и Perl трактуют данные как поток текста, который необходимо передавать дальше, среда PowerShell наделена неизмеримо более гибкими средствами хранения и передачи ссылок на объекты. Ссылки можно ставить в очередь, осуществлять в них поиск и работать с ними как с коллекциями. Первоначально язык PowerShell создавался для применения в качестве языка сценариев для среды .NET; это явно проявляется в том, что PowerShell наследует реализованные в .NET функции управления данными, однако надо отметить, что технология при этом остается доступной.
В электронной таблице с образцами объектов можно создать произвольное количество столбцов с любым объемом данных по каждому GPO. Для поддержания единообразия назовем первый столбец GPOName, так как имя GPO мы будем использовать в качестве уникального идентификатора.
Шаг 3. Создайте сценарий PowerShell
Мы начнем со сценария PowerShell, который вызывает интерфейсы COM API, с тем чтобы инициировать процесс резервного копирования GPO. В листинге содержится код этого сценария; имя файла BackupGPO.ps1. Прежде всего, сценарий создает ссылку на объект GPMC COM Automation. На языке VBScript нам пришлось бы вызывать функцию CreateObject — например, Set GPM = CreateObject(«GPMgmt.GPM»). Соответствующая функция языка PowerShell называется New-Object. Она передает параметр -comobject GPMgmt.GPM, как показывает фрагмент A листинга, инициализирует объект GPMC COM. В PowerShell есть полезная функция: стоит пользователю ввести несколько первых символов команды, параметра или объекта и нажать клавишу табуляции, PowerShell вводит имя, в наибольшей степени соответствующее этим символам. Если же пользователь будет по-прежнему нажимать клавишу табуляции, программа начнет выводить в циклическом режиме все возможные команды, параметры или атрибуты объекта. Так, если вы, установив переменную $GPM во фрагменте A листинга, нажмете клавишу табуляции, то увидите все функции COM, экспонированные консолью GPMC.
Кроме того, нам нужно захватить константы объекта GPMC и создать переменную, которую можно будет передать в наши функции COM; эту задачу выполняет код, помещенный во фрагменте B. Далее нам нужно использовать имена DNS из файла образцов .csv, с тем чтобы, вызвав интерфейс GetDomain GPMC API, получить доменный объект GPMDomain; эту задачу выполняет код, показанный во фрагменте C.
Теперь необходимо вызвать GPMC API для выбора соответствующего GPO, как это делает код во фрагменте D. Обратите внимание: в этой строке кода используется новый операнд ($_) и определяется имя столбца в файле .csv, который мы создали ранее. Операнд $_ дает нам возможность обращаться к наборам данных внутри каждого столбца, которые хранятся в PowerShell в виде объектов .NET.
Последняя в наших вызовах API GPMC (см. фрагмент E) представляет собой последний вызов, цель которого — выполнить операцию резервного копирования. Для этого примера я указал, что резервные копии должны храниться в каталоге C:ackup. Это местоположение может быть введено или может являться частью столбцов во входном файле .csv. Команда PowerShell имеет вид
$Result = $GPO.Backup («C:ackup», $_ .Description)
Обратите внимание: при передаче имени каталога вызову функции на основе модели COM необходимо использовать две обратные косые черты, поскольку одинарные обратные косые черты интерпретируются как служебные символы. Перед тем как вызывать сценарий PowerShell, убедитесь, что каталог C:ackup существует.
Наконец, мы добавляем одну строку кода в начале для обозначения имени фильтра и помещаем созданный на данный момент код в отдельный блок, с тем чтобы объекты могли передаваться в качестве фильтра. Функции обычно создаются с передаваемыми параметрами. В нашем случае передается весь файл .csv, и мы получаем динамический доступ ко всем объектам внутри этого файла. Использовать функции не имеет смысла, поскольку мы не указываем статические параметры. Фильтры же принимают все, что им передается; код внутри фильтра осуществляет обработку данных, а также выбор данных, которые будут использоваться.
Если бы мы захотели расширить возможности сценария, то смогли бы добавить блоки проверки ошибок. С их помощью можно было бы убедиться в том, что переменную $GPMResult можно использовать и что не были указаны исключения, позволяющие судить о том, успешно или неуспешно завершилась работа сценария. Но я не хотел усложнять наш пример.
Шаг 4. Задайте фильтр Backup Filter
Сейчас мы увидим, какими невероятными возможностями и гибкостью обладает среда PowerShell. Сначала запустим PowerShell и изменим политику PowerShell так, чтобы было разрешено выполнение сценариев. Для этого нужно ввести следующий код
PS C:> Set-ExecutionPolicy –executionPolicy Unrestricted
Теперь введите код PowerShell из листинга, вызвав файл PowerShell методом dot source (т. е. укажите путь к сценарию, предварив его точкой и пробелом). В результате будет загружен фильтр, который мы создали в текущей среде исполнения PowerShell.
Как я уже разъяснял, при передаче файла .csv в качестве параметра передается только ссылка на этот файл .csv в функции. Затем приходится вписывать код в функцию, чтобы вручную анализировать содержимое файла .csv. При передаче файла .csv в виде фильтра мы получаем возможность обращаться ко всем содержащимся в файле элементам данных как к объектам .NET внутри данного фильтра.
Введите
PS C:> . C:PSDemoBackupGPOs.ps1
Теперь импортируйте файл .csv и передайте его созданному фильтру Do-GPOBackup. Введите код
PS C:> import-csv C:PSDemoGPOList.csv
| Do-GPOBackup
Вы получите выходные данные, показанные на экране 2.
В качестве входных данных для выполнения созданного сценария можно использовать любой файл .csv, предназначенный для выполнения операций на объектах GPO. Кроме того, мы можем добавить код для проверки параметров, с тем чтобы выполнять операции только над теми GPO, которые соответствуют определенному доменному имени. Так, чтобы указать домен Americas, введите
PS C:> import-cvs C:PSDemoGPOList.csv
| {where $_.Domain = «Americas»} | Do-GPOBackup
Еще одна возможность — взять результат и переслать его в диаграмму для указания объектов GPO, с которых были сняты резервные копии, для выяснения, на копирование какого объекта было затрачено больше всего времени, и для указания объектов, которые в наибольшей степени снижают быстродействие системы. Вариантов бесконечное множество. Мы могли бы модифицировать сценарий PowerShell таким образом, чтобы вместо резервного копирования он периодически восстанавливал важнейшие GPO по расписанию, сформированному с помощью программы Task Scheduler. В дополнение к этому мы можем просто изменить содержимое электронной таблицы, и тогда будет динамически изменен список объектов GPO, которые мы копируем или восстанавливаем.
Назад к основам
Приведенный пример показывает исключительную гибкость оболочки PowerShell. Используя его как основу, можно автоматизировать процессы составления отчетов, анализа, создания и даже подготовки к работе новых объектов GPO. Кроме того, с помощью PowerShell вы можете устанавливать связи между объектами GPO и организационными единицами OU в каталоге AD. Надо сказать, что специалисты Microsoft использовали PowerShell как внутренний интерфейс при написании пользовательского интерфейса управления Exchange Server 2007, поэтому в качестве предпочтительного пользовательского интерфейса можно задействовать либо нечто совсем простое — например, электронную таблицу Excel, либо что-то весьма сложное — скажем, пользовательский интерфейс управления Exchange. Простое, но очень полезное окно командной строки PowerShell позволяет нам в полном смысле слова вернуться к основам.
Дэнни Ким (dkim@fullarmor.com ) — эксперт по Windows Group Policy, имеет звание Microsoft MVP
Коротко о решении
ПРОБЛЕМА
Управление объектами GPO, которые перечислены в электронной таблице Microsoft Excel, и их архивирование представляет собой сложную задачу групповой политики.
РЕШЕНИЕ
Для выполнения этой задачи можно написать простой сценарий в оболочке PowerShell.
ЧТО ДЛЯ ЭТОГО ТРЕБУЕТСЯ
Консоль Group Policy Management Console (GPMC), оболочка PowerShell, пакет Excel.
УРОВЕНЬ СЛОЖНОСТИ
2 / 5
ЭТАПЫ РЕШЕНИЯ
-
Загрузите и установите GPMC, а также PowerShell.
-
Создайте электронную таблицу с образцами GPO.
-
Создайте сценарий PowerShell.
-
Задайте фильтр резервного копирования.