Последние пробелы в возможностях администрирования Windows
Процесс написания сценариев в Windows долгое время был предметом насмешек со стороны администраторов UNIX. Главная причина заключалась в том, что в Windows отсутствует множество функций, которые могли бы сделать написание сценариев действительно эффективным. Однако специалисты Microsoft не только быстро наверстали упущенное в этой области, но и преподнесли сюрприз, разработав новую среду для написания сценариев под названием Windows PowerShell (прежнее название — Monad).
В PowerShell реализован ряд таких возможностей, о которых пользователи Windows никогда и не слышали, а некоторые известные функции радикально усовершенствованы. Хотя PowerShell по-прежнему считается кандидатом на выпуск, познакомиться с тем, какие пробелы в области создания сценариев закрывает PowerShell и как именно он работает, будет полезно уже сейчас.
Заполняем пробелы
PowerShell была задумана разработчиками Microsoft как более мощная среда для написания сценариев и работы из командной строки. Разработчики PowerShell преследовали несколько целей. Если в двух словах, то требовалось создать более функциональную и простую в использовании среду составления сценариев, чем в каком-либо аналогичном продукте для любой другой операционной системы. Кроме того, эта среда должна была подходить для решения задач, стоящих перед системными администраторами, удовлетворять требованиям разработчиков программного обеспечения и интегрироваться с платформой Microsoft .NET Framework. Достижение поставленных целей означало, что Microsoft предстоит создать некоторые отсутствующие в инструментарии Windows Scripting функции. Для этого разработчики добавили в PowerShell все самое лучшее из среды командной строки. Рассмотрим эти дополнения подробнее.
Композиция. Композиция команд позволяет создавать сложные команды, связывая в единые строки множество мелких команд, каждая из которых решает только одну задачу. Для UNIX Shell это обычное дело. Большинство администраторов UNIX применяют композицию каждый день, даже не подозревая, что это так называется. Разработчики UNIX Shell изначально стремились создать командный процессор, или оболочку, с возможностью использовать огромное количество маленьких одноцелевых команд, которые можно комбинировать самыми разными способами. Этот подход резко контрастировал с уже существующими решениями, когда упор делался на использование больших и сложных командных структур.
Конвейерная обработка. Конвейерная обработка позволяет получить результаты работы одной команды и передать их на вход следующей команды при композиции. Командный интерпретатор Windows в этом смысле обладает весьма ограниченными возможностями. Например, если выполнить
dir | more
то вывод команды Dir будет передан по конвейеру команде More. Однако большинство команд Windows не поддерживают конвейерную обработку (или похожую процедуру — перенаправление ввода/вывода).
Объектная ориентация. Результатами работы команд PowerShell являются объекты, а не блоки текста. У объектов есть свойства (которые можно просмотреть и изменить) и методы (исполняемые действия). Например, команда get-mailbox используется для получения списка почтовых объектов, которыми можно впоследствии манипулировать самыми разными способами. Команда get-mailbox возвращает не список названий почтовых ящиков; она возвращает список объектов, которые представляют собой собственно почтовые ящики. Как будет показано в разделе «PowerShell в действии», использование команд, возвращающих объекты, дает сценариям огромное преимущество.
Безопасность. Большинство команд PowerShell, которые создают или изменяют объекты, поддерживают два флага: confirm и whatif. При установке флага confirm система спрашивает, действительно ли нужно выполнить то или иное действие. При установке флага whatif будет показано, как в результате тех или иных действий изменится объект, но при этом никакие реальные изменения производиться не будут. Это очень удобные флаги, позволяющие тестировать внесение изменений до того, как они будут сделаны в действительности.
Непротиворечивая структура и непротиворечивое именование. Почти для всех команд PowerShell используется непротиворечивая структура типа «действие — объект» и непротиворечивые именованные шаблоны. К тому же самих действий не так много. Благодаря непротиворечивости и небольшому словарю действий легко понять принцип конструирования команд, если известен объект, с которым предстоит работать.
Документация. PowerShell предоставляет тщательно проработанный оперативный справочник для объектов, команд и собственно исполняемой среды.
Азбука PowerShell
Для PowerShell подготовлено огромное число командных структур, именуемых cmdlet (произносится как command-let). Cmdlet — это аналоги динамических библиотек, DLL, которые сами по себе не могут быть запущены как приложения, но в них содержатся исполняемые объекты. По этой причине cmdlet используются во внутренних вызовах из командного интерпретатора PowerShell. В PowerShell Release Candidate 1 (RC1) включено более 120 cmdlet.
Cmdlet могут иметь параметры, к которым можно обратиться по имени или по позиции (т. е. интерпретация параметра PowerShell будет выполняться в зависимости от местоположения параметра в командной строке). Например, при использовании cmdlet под названием get-mailbox самый первый параметр всегда содержит указание на почтовые ящики, над которыми выполняется работа. К остальным параметрам в данном cmdlet можно обратиться по имени.
Существует несколько встроенных cmdlet, обращение к которым будет производиться достаточно часто, так что о них стоит упомянуть отдельно.
Семейство cmdlet под названием format (конкретно format-table и format-list) получает поток объектов и соответствующим образом форматирует их. Можно указать, какие свойства объектов будут отображаться. Например, при выводе на экран списка почтовых ящиков, когда интерес представляет только название ящика и его размер, используется команда
get-mailboxstatistics | format-table name, size
Команда представлена в двух строках, но в PowerShell ее следует задать в одной. Это замечание справедливо для всех примеров данной статьи.
Where позволяет выбирать используемые объекты. Например, если выдать команду
get-eventlog application | where {$_.ID eq «-1018»}
PowerShell обратится к журналу Application и извлечет все события с ID 1018. Любопытно, что where — один из немногих PowerShell cmdlet, для которых сделано отступление от упомянутого выше синтаксиса типа «действие — объект».
Как следует из названия, group объединяет объекты согласно указанному свойству. Предположим, нам нужно получить список имен и размеров всех почтовых ящиков организации, сгруппированный по принадлежности к базе данных почтового сервера. Такая команда могла бы выглядеть следующим образом:
get-mailboxstatistics | group MailboxDatabase | format-table count,name
Если посмотреть на уже написанные сценарии на PowerShell, можно заметить странные аббревиатуры для некоторых cmdlet, такие как fl вместо format-list. Все просто — PowerShell поддерживает сокращенные имена (или псевдонимы, alias). Для многих команд общего употребления существуют встроенные сокращенные имена. Кроме того, вы сами можете описать собственные псевдонимы в профиле оболочки; это должен быть специальный файл, который PowerShell использует по умолчанию для данного пользователя.
Язык сценариев PowerShell, Powerscript, поддерживает все конструкции, возможные для такого языка, — циклы, ветвления, манипуляции со строками. Для тех, кто когда-нибудь работал в VMS или писал на JCL при работе на мэйнфреймах IBM, синтаксис Powerscript не будет чем-то совершенно новым. Составители сценариев в UNIX также увидят знакомые элементы, как и системные администраторы, пишущие сценарии на VBScript.
PowerShell в действии
Первым продуктом Microsoft, для которого в полной мере будут использоваться преимущества PowerShell, станет Microsoft Exchange Server 2007 (прежнее название — Exchange 12). Соответственно, в этом разделе статьи приводятся примеры, относящиеся к Exchange. Примеры для Windows будут продемонстрированы в следующих статьях. Пользовательский интерфейс Exchange 2007 полностью основан на PowerShell. Любое действие, выполненное в среде Exchange System Manager (ESM) в Exchange 2007, — это задача, причем каждая такая задача написана на PowerShell. Перед пользователями открываются огромные возможности: все, что можно сделать в ESM, можно повторить из командной строки, чего нельзя сказать об Exchange Server 2003. Какие-то дополнительные операции могут быть выполнены только из командной строки, хотя полный список таких операций еще не опубликован.
Для Exchange 2007 разрабатывается собственный набор cmdlet, специально для работы с объектами Exchange. Эти команды можно будет использовать для манипуляции со всеми видами объектов, включая Microsoft Outlook Web Access (OWA), виртуальные каталоги, почтовые ящики, группы рассылки и хранения, а также унифицированные планы набора номера. Поскольку все cmdlet подчиняются одним и тем же шаблонам именования, очень просто понять функции таких cmdlet, как, например, new-mailbox, enable-mailbox или get-mailboxStatistics.
Благодаря конвейерной обработке и композиции можно выполнять с командной строки такие задачи, которые не могли быть выполнены в Exchange 2003 ESM и даже в оснастке Microsoft Management Console (MMC) Active Directory Users and Computer. Предположим, например, что существует политика квотирования размера почтового ящика по умолчанию, а нужно применить специальное квотирование (500 Мбайт) для членов группы Executive. В Exchange 2003 политики квотирования почтовых ящиков накладывались на базы данных, так что можно было выбрать один из четырех вариантов: отказаться от такой политики, переместить пользователей эксклюзивной группы в отдельную базу данных почтовых ящиков, задействовать Active Directory Users and Computers для ручного накладывания квоты для каждой учетной записи или написать сценарий, который использует Active Directory Service Interfaces (ADSI) для внесения необходимых изменений. В Exchange 2007 с поддержкой PowerShell задача индивидуального квотирования решается гораздо проще. Нужно просто запустить команду
Хотя команда короткая, в ней используется и конвейерная обработка, и композиция. Обратите внимание, что параметр для getgroup — позиционный, тогда как для set-mailbox применяется именованный параметр (SendStorageQuota). Почему? Все, что можно сделать с get-group, — получить список объектов типа «учетные записи», которые являются членами указанной группы, но set-mailbox имеет огромный перечень параметров, которые можно задать. Например, можно с легкостью установить специальные квоты для тех пользователей, в атрибуте Last Name которых присутствует буква х:
Как видно из приведенного примера, в PowerShell разрешается использовать групповые символы для поиска коллекций объектов, которые вас интересуют. Однако делать это совсем не обязательно. По умолчанию cmdlet возвращают все объекты выбранного типа. Например, если запустить cmdlet
get-mailboxstatistics
мы получим статистику обо всех почтовых ящиках организации Exchange. Такое свойство cmdlet сильно упрощает выполнение задач, применяемых ко всем объектам заданного типа. Например, если нужно извлечь все почтовые ящики организации, сгруппировать их по базам данных почтовых ящиков, в которых они расположены, и отформатировать результирующий набор объектов в виде списка, следует задать команду
get-mailbox | group Database | fl
А вот еще более впечатляющий пример использования cmdlet. Команда
обращается к каждому виртуальному каталогу OWA в организации, а затем устанавливает средства управления визуализацией WebReady Document Viewing в режим блокировки доступа ко всем вложениям, за исключением файлов, которые могут отображаться в режиме Document Viewing. Одной строкой вы фактически запретили пользователям общедоступных компьютеров сохранять вложения или обращаться к ним, за исключением тех вложений, которые можно преобразовать. Это в огромной степени снижает риск случайного раскрытия конфиденциальных данных. Если бы ту же задачу пришлось выполнять «вручную», легко было бы пропустить один или несколько серверов, что сделало бы защиту неполной.
Избранные функции
По мере работы с PowerShell вы заметите, что некоторые функции используете постоянно. Перечислю для примера свои излюбленные функции.
Start-transcript и партнер stop-transcript. Команда start-transcript сообщает PowerShell о необходимости вести полный отчет о взаимодействии со средой командного интерпретатора, чтобы потом было проще вернуться к предыдущей сессии и понять, что именно было сделано. Можно даже использовать этот журнал для включения ранее заданного набора команд в повторно используемый сценарий. Stop-transcript сообщает PowerShell о прекращении журналирования.
Get-command вместе с флагом -synopsis. Если неизвестно, что делает тот или иной cmdlet, можно воспользоваться командой get-command с флагом -synopsis для получения общей информации об указанном cmdlet. Запустим, для примера, команду
get-command -name get-service -synopsis
PowerShell предоставит общие сведения об использовании cmdlet get-service.
Get-excommand. Если администратор не знает, какой именно cmdlet ему нужен, лучше использовать get-excommand для поиска cmdlet, которые в принципе могут представлять интерес для решения поставленной задачи. При использовании get-excommand вместе с групповыми символами очень просто отыскать то, что требуется. Например, команда
get-excommand *ailbox*
возвращает список cmdlet, свойств и методов, относящихся к почтовым ящикам (mailboxes). Чтобы получить только список cmdlet, воспользуйтесь where для фильтрации результатов работы get-excommand:
get-excommand *ailbox* | where {$.Name -eq «Cmdlet»}
Изучайте PowerShell
Конечно, поначалу самостоятельно созданные сценарии на PowerShell не будут шедеврами. Пока PowerShell не станет привычным, пока не будут изучены все способы его применения, наверное, вы будете думать о PowerShell как о неком дополнении к уже существующим методам написания сценариев. Я рекомендую для изучения книгу Andy Oakley Monad и Web-ресурс Windows PowerShell Quick Start, который является частью Windows PowerShell Wiki на Channel9 компании Microsoft (http://channel9.msdn.com).