Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
CheckBootSpeed - это диагностический пакет на основе скриптов PowerShell, создающий отчет о скорости загрузки Windows 7 ...
Вы когда-нибудь хотели создать установочный диск Windows, который бы автоматически установил систему, не задавая вопросо...
Если после установки Windows XP у вас перестала загружаться Windows Vista или Windows 7, вам необходимо восстановить заг...
Программа подготовки документов и ведения учетных и отчетных данных по командировкам. Используются формы, утвержденные п...
Red Button – это мощная утилита для оптимизации и очистки всех актуальных клиентских версий операционной системы Windows...
OSzone.net Microsoft PowerShell Оболочка Windows PowerShell RSS

Оболочка Windows PowerShell

Текущий рейтинг: 3.49 (проголосовало 35)
 Посетителей: 20569 | Просмотров: 27606 (сегодня 0)  Шрифт: - +

Данная статья основывается на предварительной версии Windows PowerShell. Любая информация, содержащаяся в статье, может быть изменена.

Разработка заняла немало времени, но оболочка Windows PowerShell почти готова к выпуску. Это означает, что для администраторов Windows пришло время с ней познакомиться.. Оболочка Windows PowerShell предоставляет, вероятно, самый простой и наиболее гибкий способ автоматизации широкого спектра административных задач, делая работу более эффективной и результативной.

Кроме того, что еще более важно, корпорация Майкрософт встраивает в оболочку Windows PowerShell™ графические консоли администрирования таких продуктов, как Exchange Server 2007 и System Center 2007. Это означает, что с помощью Windows PowerShell можно будет выполнить почти любую административную задачу. Корпорация Майкрософт планирует со временем включить в состав оболочки возможности администрирования большего числа продуктов. Таким образом, в итоге оболочка Windows PowerShell может стать первым универсальным инструментом для администрирования почти любым серверным продуктом корпорации Майкрософт. Чтобы помочь вам ознакомиться с оболочкой Windows PowerShell, я буду регулярно обсуждать ее в этой новой колонке. Копию оболочки можно загрузить по следующему адресу (на английском языке).


Мощность и простота

Как можно понять из названия, Windows PowerShell — это оболочка, похожая на существующую со времен Windows NT® 3.1 командную строку (Cmd.exe). Оболочка Cmd.exe не сходит со сцены, но с появлением Windows PowerShell останется все меньше причин продолжать ею пользоваться.

Работа с Windows PowerShell не особо отличается от работы с Cmd.exe — если, конечно, не считать того, что у Windows PowerShell больше возможностей. Как и Cmd.exe, оболочка Windows PowerShell имеет встроенный язык сценариев. Правда, намного более гибкий, чем примитивный пакетный язык Cmd.exe. Насколько гибкий? Оболочка Windows PowerShell позволяет автоматизировать чрезвычайно сложные задачи с помощью языка, включающего в себя немногим более полдюжины встроенных ключевых слов.

Раз уж я упомянул сценарии, необходимо коснуться и вопросов безопасности. Оболочка Windows PowerShell впитала в себя все, что корпорация Майкрософт узнала о безопасности за последние десять лет. По умолчанию оболочка Windows PowerShell не позволяет запускать сценарии, ее можно использовать только интерактивно для выполнения отдельных команд. Если запуск сценариев все же разрешен, можно настроить Windows PowerShell на выполнение только подписанных сценариев. Все эти меры позволяют гарантировать, что Windows PowerShell не станет вторым VBScript (это замечательный язык, которым часто злоупотребляли для создания вредоносных сценариев). Язык VBScript тоже еще не уходит со сцены, но вы, вероятно, обнаружите, что для решения множества различных задач удобнее использовать Windows PowerShell.

С помощью Windows PowerShell можно делать практически все, что раньше делалось с помощью Cmd.exe. Например, можно выполнить команду ipconfig и получить тот же самый знакомый вывод. Но оболочка Windows PowerShell представляет целый новый набор команд, которые не являются внешними исполняемыми файлами. Эти командлеты («cmdlet» произносится как «команд-лет») встроены прямо в Windows PowerShell. (Несколько наиболее полезных командлетов, которые помогут начать работу с Windows PowerShell, можно найти на боковой панели «Десять самых важных командлетов, готовых к работе».)

Названия всех командлетов соответствуют стандартному формату «глагол-существительное», благодаря чему их легче понять и запомнить. Например, в результате запуска командлета Get-Command будет выведен список всех имеющихся командлетов. Вероятно, наиболее полезным для администратора является командлет Get-WMIObject. Предположим, требуется выяснить, какой пакет обновления установлен на компьютере Server2. Достаточно просто выполнить команду

Get-WMIObject Win32_OperatingSystem –Property ServicePackMajorVersion
 –Computer Server2

Чтобы получить те же сведения с помощью VBScript, необходимо написать несколько строк кода. Другие командлеты позволяют работать со службами (Start-Service, Stop-Service и т. д.), процессами (Stop-Process и другие), файлами (например Rename-Item, Copy-Item, Remove-Item, Move-Item) и так далее. У многих из этих командлетов есть сокращенные имена, также называемые псевдонимами. Например, вместо Get-WMIObject достаточно ввести просто gwmi. Получить список этих сокращенных имен можно с помощью команды Get-Alias.

Десять самых важных командлетов, готовых к работе

  • Get-Command возвращает список всех имеющихся командлетов.
  • Get-Help отображает справочную информацию о командлетах и общие сведения.
  • Get-WMIObject возвращает сведения об управлении с помощью WMI.
  • Get-EventLog возвращает журналы событий Windows.
  • Get-Process возвращает отдельный активный процесс или список активных процессов.
  • Get-Service возвращает одну из служб Windows.
  • Get-Content считывает содержимое текстового файла, обрабатывая каждую строку как дочерний объект.
  • Add-Content добавляет содержимое в конец текстового файла.
  • Copy-Item копирует файлы, папки и другие объекты.
  • Get-Acl возвращает списки управления доступом (ACL).

Полный список командлетов, входящих в состав Windows PowerShell, можно найти на веб-узле windowssdk.msdn.microsoft.com/en-us/library/ms714408.aspx (на английском языке).


Что дает ориентация на объекты

Поскольку оболочка Windows PowerShell встроена в Microsoft® .NET Framework, она является полностью объектно-ориентированной. Обычно это интересует только разработчиков программного обеспечения, но в данном случае ориентация на объекты приводит к значительному сокращению временных затрат для администраторов. Это происходит потому, что администраторы теперь могут напрямую работать с мощными объектами прямо из текстовой оболочки. Рассмотрим следующий пример.

Get-Process | Sort-Object pm –desc | Select-Object –first 10

Это всего лишь одна строка с тремя различными командлетами, разделенными знаками вертикальной черты (подробнее об этом будет рассказано в статье ниже). За счет выполнения первого командлета будут получены все запущенные процессы, которые затем передаются командлету Sort-Object. Этот второй командлет сортирует все процессы в порядке убывания по свойству pm (Physical Memory, физическая память) каждого объекта процесса. Затем отсортированный набор объектов процессов передается командлету Select-Object, который извлекает и отображает первые десять из них. Что мы получаем в результате? С помощью одной строки отображаются 10 процессов, занимающих больше всего физической памяти компьютера, как показано на рис. 1. Это чрезвычайно эффективный способ выполнить быструю проверку в ходе диагностики.

Рис. 1 Диагностика с помощью одного командлета
Рис. 1 Диагностика с помощью одного командлета

Использование знака вертикальной черты (этот символ на клавиатуре США обычно расположен на клавише обратной косой черты) — это важная часть того набора функций, который делает оболочку Windows PowerShell такой полезной. С помощью символа вертикальной черты можно передавать объекты от одного командлета к другому, что позволяет каждой следующей команде уточнять результаты, форматировать их для вывода и т. д. Этот механизм работает, поскольку каждый командлет возвращает не текст, а один или несколько объектов, с которыми могут работать следующие командлеты.

Использование объектов в Windows PowerShell полностью распространяется на переменные. Нет необходимости описывать переменные заранее. Чтобы начать использовать их, нужно просто добавить знак доллара ($) перед именем переменной. Хотя это и необязательно, можно также указать оболочке Windows PowerShell тип данных, которые будут храниться в переменной. Это позволит оболочке сопоставить переменную с одним из чрезвычайно мощных типов .NET Framework, предоставив администратору множество дополнительных встроенных возможностей. Предположим, вам требуется вывести запрос имени компьютера и получить версию пакета обновления, установленного на этом компьютере. Однако вы не знаете, укажет ли пользователь при вводе имени две обратные косые черты (например, \\Сервер2). Поскольку известно, что командлету Get-WMIObject обратные косые черты не требуются, можно сохранить имя компьютера в строковой переменной и воспользоваться методом Replace, чтобы заменить обратные косые черты на пустые строки, как показано ниже.

[string]$c = Read-Host "Enter computer name"
$c = $c.Replace("\","")
    Get-WMIObject Win32_OperatingSystem
    –Property  ServicePackMajorVersion
    –Computer $c

Значение параметра -Computer было передано с помощью переменной $c. Эта переменная была изначально создана как строковая и поэтому обладала всеми возможностями типа String платформы .NET Framework, включая метод Replace. Конечно, изучение всех этих особенностей займет некоторое время, но, возможно, будет проще познакомиться с ними на примерах. Сама оболочка Windows PowerShell помогает упростить обучение. Например, если ввести выражение $c = $c. (не забыв про точку) и нажать клавишу Tab, оболочка Windows PowerShell отобразит Clone(), первый метод типа String. Если продолжать нажимать клавишу Tab, будут последовательно отображаться все доступные методы. В сущности, при этом оболочка Windows PowerShell показывает, что именно ей известно о способах использования типа String!

Теперь более сложная задача: чтение списка имен компьютеров из файла, по одному имени в строке, и отображение номера версии пакета обновления для каждого компьютера. Для решения такой задачи с помощью VBScript потребовалось бы написать десяток или более строк кода. В cmd.exe пришлось бы воспользоваться сложным пакетным файлом. В Windows PowerShell эта задача решается с помощью всего одной строки.

Get-Content "c:\computers.txt" | foreach
{ $_; gwmi Win32_OperatingSystem -prop
ServicePackMajorVersion -comp $_ }

Командлет Get-Content считывает содержимое файла C:\Computers.txt. Каждая строка файла превращается в самостоятельный объект. Этот набор объектов — то есть, имен компьютеров — передается команде foreach, которая в действительности представляет собой псевдоним командлета ForEach-Object. Команды внутри фигурных скобок повторяются один раз для каждого полученного объекта (в нашем примере — для каждого имени компьютера). Особая переменная $_ содержит текущий объект (а именно, текущее имя компьютера).

На самом деле внутри фигурных скобок находятся две команды. Первая из них просто отображает текущее имя компьютера, выводя содержимое переменной $_. Вторая — уже знакомая нам команда gwmi. Результат представляет собой список номеров версий пакетов обновления для всех компьютеров, перечисленных в файле. И все это было выполнено с помощью одной относительно простой строки команд.

Обратите внимание, что для имен параметров -Property и -Computer использовались сокращения. Для Windows PowerShell достаточно, чтобы сокращения позволяли однозначно определить имена параметров.


Удобочитаемость и повторное использование

Размещение команд и параметров в одной строке не способствует повышению удобочитаемости. К счастью, Windows PowerShell позволяет использовать более удобный вариант, который можно вводить прямо в оболочке, не создавая сценария. Вот как это могло бы выглядеть:

PS C:\> $names = get-content "c:\computers.txt"
PS C:\> foreach ($name in $names) {
>> $name
>> gwmi Win32_OperatingSystem -prop ServicePackMajorVersion -comp $name
>> }
>>

На этот раз содержимое файла сохраняется в переменной $names. В этом примере все еще используется команда «foreach», но она не входит в состав конвейера, и поэтому ей нужно указать, какой набор объектов должен быть циклически обработан и в какой переменной следует хранить каждый объект. Это сделано с помощью фрагмента ($name in $names). Все остальное практически не изменилось, и нажатие клавиши ВВОД приведет к выполнению кода и отображению результатов.

Если тот же самый код необходимо использовать несколько раз, можно просто оформить его как функцию. В этот раз введите следующий фрагмент кода прямо в оболочке:

PS C:\> function Get-ServicePacks ($file) {
>> $names = get-content $file
>> foreach ($name in $names) {
>> $name
>> gwmi win32_operatingsystem -prop servicepackmajorversion -comp $name
>> }
>> }
>>

Как видите, на самом деле почти ничего не изменилось. Предыдущий пример просто был оформлен как функция с именем «Get-ServicePacks». (При этом сохраняется соглашение Windows PowerShell о формате имен «глагол-существительное».) 101% Technet_Review rusloc1 11/15/2006 10:35:35 AM The function now has an input parameter named $file, which has been substituted in the Get-Content cmdlet so that a different file can be specified when the function is run. Different match in memory: Эта функция имеет входной параметр с именем $file, который подставляется в cmdlet-команду Get-Content, что позволяет указать другой файл при запуске данной функции. The function now has an input parameter named $file, which has been substituted in the Get-Content cmdlet so that a different file can be specified when the function is run. Эта функция имеет входной параметр с именем $file, который подставляется в командлет Get-Content, что позволяет указать другой файл при запуске данной функции. Теперь, когда функция определена, для ее запуска достаточно указать ее имя, почти как для командлета, и передать ей входной параметр.

PS C:\> Get-ServicePacks c:\computers.txt

Результаты показаны на рис. 2.

Недостаток такого способа заключается в том, что функция будет существовать только до тех пор, пока запущен данный экземпляр Windows PowerShell. После закрытия оболочки функция исчезнет. Впрочем, функцию можно скопировать в свой профиль Windows PowerShell. Он представляет собой разновидность сценария автозапуска, который выполняется каждый раз при запуске Windows PowerShell. При этом функция будет доступна в каждом открытом вами окне Windows PowerShell. Кроме того, функцию можно оформить как отдельный сценарий. Тогда для ее запуска достаточно будет ввести путь и имя файла этого сценария.

Рис. 2 Результаты работы функции Get-ServicePacks
Рис. 2 Результаты работы функции Get-ServicePacks


Мир как файл (или папка)

Все же оболочка Windows PowerShell — это нечто большее, чем просто функции и командлеты. Рассмотрим в качестве простого примера управление файлами. Вы, вероятно, хорошо знакомы с переходами по дискам и папкам в сmd.exe. Необходимо ввести C:, чтобы переключиться на диск C, и cd \test, чтобы перейти в папку C:\Test. Оболочка Windows PowerShell работает точно так же, хотя cd — это на самом деле псевдоним для командлета Set-Location.

Попробуйте запустить командлет Get-PSDrive, который отображает список всех имеющихся дисков. Кроме обычных дисков C:, D: и, возможно, A:, в списке обнаружатся диски с именами Cert, Env, HKCU и HKLM. Оболочка Windows PowerShell действительно показывает много разных типов ресурсов хранения как «диски». Это позволяет получить доступ к локальному хранилищу сертификатов, переменным среды и реестру с помощью знакомого интерфейса переходов, такого же, как для файлов.

Чтобы перейти к кусту реестра HKEY_LOCAL_MACHINE, достаточно ввести Set-Location HKLM: (или cd hklm:, если вам больше нравятся сокращенные имена) и нажать клавишу ВВОД. Затем выполнить команду cd software\microsoft для перехода к разделу SOFTWARE\Microsoft. Можно воспользоваться командой dir (это псевдоним для командлета Get-ChildItem), чтобы получить список подразделов этого раздела реестра. Если требуется удалить раздел, воспользуйтесь командой del, как если бы этот раздел был файлом или папкой. (Впрочем, будьте осторожны. Удаление нужных разделов или некорректное изменение реестра может вызвать серьезные проблемы.)

Подобная гибкость становится возможной благодаря разработчикам продуктов, которые приводят ресурсы (такие как реестр и хранилище сертификатов) к формату, похожему на формат файловой системы. Корпорация Майкрософт планирует расширить оболочку Windows PowerShell для работы с дополнительными продуктами, обеспечивая возможность переходов, например, в хранилище сервера Exchange Server, как если бы это была файловая система. Описанная выше методика очень важна, поскольку она позволяет работать с огромным множеством хранилищ, используемых системой Windows, причем все они выглядят одинаково. Кроме того, всеми этими хранилищами можно управлять с помощью системы команд и методов, с которыми вы уже знакомы.


Безопасность прежде всего

Как уже упоминалось выше, оболочка Windows PowerShell была разработана с учетом безопасности и надежности. Основной компонент безопасности оболочки Windows PowerShell — это ее политика выполнения. По умолчанию для этой политики задано значение Restricted. В этом можно убедиться с помощью командлета Get-ExecutionPolicy. В режиме Restricted сценарии не выполняются. Точка. Поскольку это режим по умолчанию, оболочку Windows PowerShell нельзя использовать для запуска готовых сценариев.

Задать другие режимы можно с помощью командлета Set-ExecutionPolicy. Мне, например, больше всего нравится режим RemoteSigned. В этом режиме допускается запуск локальных (но не удаленных) сценариев, не имеющих цифровой подписи, что обеспечивает самый простой способ разработки и тестирования сценариев. Режим AllSigned не разрешает запуск сценариев, если они не подписаны с помощью сертификата, выпущенного доверенным издателем. И, наконец, в режиме Unrestricted можно запускать все что угодно. Я рекомендую никогда не включать этот режим, поскольку он позволяет использовать Windows PowerShell для запуска вредоносных сценариев, которые могут каким-либо образом оказаться на компьютере. Обратите внимание, что политику выполнения можно также задать с помощью групповой политики, которая перекрывает локальные параметры. (Если параметр групповой политики перекрывает локальные параметры, команда «Set-ExecutionPolicy» выведет предупреждающее сообщение.)

Кроме того, в оболочке Windows PowerShell нельзя выполнить сценарии из текущего каталога. Необходимо указать путь. Это было сделано для того чтобы предотвратить подмену команд. Предположим, некто создает сценарий с именем IPConfig.ps1 (PS1— это расширение имени файла для сценариев Windows PowerShell). Если бы файлы можно было запускать из текущей папки, то существовал бы риск, что ввод команды ipconfig приведет к запуску сценария, созданного этим «некто», хотя на самом деле вы хотели выполнить программу Windows Ipconfig.exe. Однако, поскольку оболочка Windows PowerShell не поддерживает запуск сценариев из текущей папки, такая ошибка исключается. Если действительно требуется запустить сценарий из текущей папки, нужно просто указать путь, например .\myscript. Явная ссылка на текущую папку позволяет подтвердить, что требуется запустить именно сценарий, а не команду оболочки.

Кроме того, оболочка Windows PowerShell обладает возможностями, которые позволяют сделать эксперименты более безопасными. Например, рассмотрим (только не надо пробовать) такое пугающее сочетание:

Get-Process | Stop-Process

Командлет Get-Process создает набор объектов процессов и передает их командлету Stop-Process, который действительно остановит их! В результате мы получим синий экран с ошибкой STOP примерно через пять секунд после остановки критических процессов Windows. Однако можно просто посмотреть, что должно произойти, не выполняя команд. Для этого достаточно добавить очень простой параметр -Whatif.

Get-process | Stop-Process -Whatif

Запуск такой команды в Windows PowerShell выдаст целый ряд отчетов о том, к чему бы привело исполнение командлетов без их фактического выполнения. Параметр – Whatif еще не описан во встроенной справочной системе Windows PowerShell (к которой можно получить доступ с помощью псевдонима help), но постарайтесь его не забывать. Это отличный инструмент для тестирования сценариев и командлетов. Он позволяет проверить результаты их выполнения и в то же время избежать риска сделать что-нибудь потенциально вредное или опасное.


Заключение

Среди возможностей, которые не вошли в данную версию Windows PowerShell, возможно самая важная — это поддержка интерфейса служб каталогов Active Directory®Services Interface (ADSI). (ADSI). Хотя оболочка Windows PowerShell может использовать очень сложные классы .NET для работы со службой каталогов Active Directory и другими службами каталогов, простой командлет Get-ADSIObject пока отсутствует. В результате работа с объектами каталогов немного затруднена.

Кроме того, оболочка Windows PowerShell часто предоставляет несколько разных способов решения одной и той же задачи. В общем, это хорошо, но процесс изучения Windows PowerShell становится более запутанным, поскольку для любой данной задачи можно найти полдесятка разных примеров ее решения.

Все это со временем будет приведено в порядок, и группа разработчиков Windows PowerShell продолжит добавлять к этому продукту новые компоненты и возможности. Чтобы быть в курсе событий, посетите блог группы разработчиков (на английском языке).

Автор: Дон Джонс (Don Jones)  •  Иcточник: TechNet Magazine  •  Опубликована: 23.01.2007
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:   Powershell, скрипты.


Оценить статью:
Вверх
Комментарии посетителей
Комментарии отключены. С вопросами по статьям обращайтесь в форум.