Windows PowerShell
Скачать 0.93 Mb.
|
Если у вас есть время … Давайте вернемся к началу, к командлетам Export-Csv и Export-CliXML. Используйте свою переменную $P, если она еще доступна, а если нет, введите в Windows PowerShell следующую строку: $p = Get-Process Теперь сохраните переменную в файл CSV и файл CliXML: $p | Export-CSV .\test.csv $p | Export-CliXML .\test.xml Далее импортируйте эти значения в две новые переменные: $p1 = Import-Csv .\test.csv $p2 = Import-CliXML .\test.xml C1: Вычислите среднее использование процессорного времени, максимальное и минимальное значения. Подсказка: Используйте команду Measure-Object, как в примерах выше. Делайте это по отдельности для трех переменных $p, $p1 и $p2. C2: Теперь отсортируйте переменные, которые показаны в списке, по использованию процессорного времени, и выберите первые пять. Снова сделайте это для каждой из трех переменных $p, $p1 и $p2. Все ли результаты остались теми же? Какая переменная отличается от других в разных случаях? Что здесь неправильно? Разгадка относительно проста. При экспорте в файл CSV и последующем импорте Windows PowerShell теряет информацию о типе значений. Это означает, что при использовании списка чисел, которые теперь имеют форму строк, 8,0 внезапно оказывается больше, чем 800. В файлах XML эта информация сохраняется и может использоваться для правильной сортировки. Вычислить среднее значение и т.п. легко, так, 8,0 + 800 равно 808,0 а значит выражение для Measure-Object правильно, но для сортировки оно не подходит. Убедитесь, что вы приняли это во внимание при сохранении переменных. XML может оказаться более безопасным форматом. РАБОТА С ДРУГИМИ ОБЪЕКТАМИ Windows PowerShell как машина обработки произвольных объектов С помощью Windows PowerShell можно работать не только с собственными объектами; можно получить доступ ко всему миру объектов, включая WMI, .NET и даже COM. Далее идут уроки по объектам, требующим отдельного обучения. По указанным вопросам можно найти большое количество дополнительной литературы. Сейчас мы даже не будем начинать рассматривать эти объекты, ограничившись небольшим примером для каждого. Надеюсь, это вызовет у вас желание узнать о них больше. Объекты WMI Вы, вероятно, знаете о существовании объектов WMI из Windows Scripting Host WSH и VBScript. Если нет, добро пожаловать в тему, но не ожидайте, пожалуйста, глубокого рассмотрения WMI. Мы сосредоточимся исключительно на контексте Windows PowerShell. Мы создаем объекты WMI в Windows PowerShell с помощью специального командлета Get-Wmiobject. Уже это показывает, как важен для нас WMI. Войдите в Windows PowerShell и введите следующую команду: Get-Wmiobject -Class win32_computersystem Вы увидите на экране базовую информацию о своей системе. В противоположность VBScript или другим языкам, Windows PowerShell уберегает вас от сложного синтаксиса, сводя количество вводимых данных до абсолютного минимума. Нам необходимы только: • Командлет Get-Wmiobject для определения того факта, что мы хотим работать с WMI • Соответствующий класс WMI, с которым мы хотим работать, т.е. -Class win32_computersystem Рисунок 12: вывод для объекта WMI WIN32_COMPUTERSYSTEM Выводимые данные, разумеется, составляют малую часть данных этого объекта. Для вывода списка атрибутов используйте команду Windows PowerShell Get-Member. D1: Выведите атрибут «Имя пользователя» («User name») своей системы. Подсказка: Используйте исходный пример WMI и укажите соответствующий атрибут для имени пользователя. WMI, как мы говорили, является собственным миром. Мы можем не только читать информацию, но и изменять ее. Эту операцию можно проделывать даже по сети с внешними системами, в том случае, если мы можем идентифицировать себя. Чтобы войти в мир WMI, можно использовать браузеры графических объектов, такие, как CIM Studio. Литература по этой теме даст вам всю необходимую информацию. Однако я буду рад показать вам несколько небольших примеров. Полезную помощь в повседневной работе с ИТ могут предоставить следующие классы объектов WMI: Список информации о настройках рабочего стола Get-Wmiobject -Class win32_desktop -Computername . Точка является частью команды и показывает, что вы имеете в виду свой локальный компьютер. В других случаях используйте другое имя компьютера(server1, server4.mycompany.ch, и т.д.). Информация о BIOS вашей системы: Get-Wmiobject -Class win32_bios Если вы хотите обратиться к своему компьютеру, параметр «-Computername .» необязателен. Список всех установленных исправлений Get-Wmiobject -Class win32_quickfixengineering или: Get-Wmiobject -Class win32_quickfixengineering -Property hotfixid | Select-Object -Property hotfixid Рисунок 13: Вывод исправлений в виде номеров KB Запись данных в объекты WMI производится так же, как в объекты Windows PowerShell, однако после установки новых значений следует вызвать метод Put объекта, чтобы применить сделанные изменения. Вызовите объект командой Get-Member, чтобы просмотреть его атрибуты и методы. Вы увидите, есть ли у вас возможность записывать соответствующие значения (set), или их можно только читать (get). Атрибут «Visible» в последующих примерах COM является одним из тех, которые можно как читать, так и записывать. Работа с объектами .NET и XML Возможности использования .NET и XML впечатляют не меньше, чем возможности WMI. В приложении вы найдете два примера. Один вызывает веб-сайт в сети, подключается к летнее RSS и считывает из нее все темы, а также их полные URL, в точности как ваша собственная персональная программа для чтения RSS. Первый пример впечатляюще краток и приведен здесь только в демонстрационных целях. Мы вынуждены исключить подробное обсуждение, поскольку оно не входит в круг вопросов, рассматриваемых в этой книге. В замечательной книге о Windows PowerShell «Windows PowerShell in Action» Брюса Пайетта (Bruce Payette), родителя Windows PowerShell подробно рассмотрены оба сценария. ([xml](new-object net.webclient).DownloadString( http://blogs.msdn.com/powershell/rss.aspx )).rss.channel.item | Format-Table title,link Да, вы все правильно понимаете, все что нужно для этого – две строки сценария. Синтаксис также схож с WMI. Теперь давайте заглянем внутрь скобок [XML]. Внутри имеется простой для понимания командлет new-object. Вы можете использовать его для создания нового объекта. Поскольку мы явно вводим тип (net.webclient), Windows PowerShell немедленно понимает, что это объект .NET типа Webclient. Для этого объекта мы используем метод DownloadString(url), который принимает URL-адрес (нужного веб-сайта). Все остальное – просто «обрамление»: поскольку мы знаем, что скрывается за этим адресом, мы не проверяем его; вместо этого мы считаем, что это лента RSS и вызываем объект с атрибутами, которые, как мы знаем, имеются у лент RSS. Если ввести другой URL- адрес, сценарий скорее всего не будет работать, если только вам не посчастливится наткнуться на другую ленту RSS. format-table также является обычным командлетом и просто выводит список объектов в виде таблицы. Вы можете прямо ввести столбцы, которые хотите видеть в виде заголовка (title), и URL-адрес (link) ленты RSS. В приложении вы можете найти второй пример, обозначенный «Пример 4». Этот сценарий также использует возможности работы с объектами .NET в сценариях Windows PowerShell. В нем используется компонент Windows WinForms. Скопируйте пример в Windows PowerShell и запустите его. Результат будет достаточно впечатляющим, чтобы вам захотелось узнать больше. Сведения по программированию для .NET и объектах .NET можно найти как в Microsoft MSDN, так и в одной из множества опубликованных книг по .NET. Работа с COM-объектами В нашем последнем примере я буду рад кратко рассмотреть возможности COM- объектов. Я использую пример для Excel. Если на вашем ПК не установлен Excel, вы можете просмотреть альтернативную версию с Internet Explorer. Однако я не собираюсь приводить здесь обширное введение в COM. Этот вопрос рассмотрен в таком количестве книг, что я действительно не смогу добавить ничего нового. Итак, мы говорим Windows PowerShell, что хотим работать с объектом COM. Чтобы гарантировать, что позднее мы ничего не забудем, немедленно назначим объекту переменную. Это означает, что мы получим собственный объект COM определенного типа. Специального командлета для использования COM-объектов, в отличие от объектов WMI, не существует. Вместо этого мы используем стандартный командлет для новых объектов: new-object. $a = new-object -comobject excel.application В качестве аргумента мы укажем, какой COM-объект хотим использовать. В данном случае это Excel, и мы используем аргумент Excel.Application. Как мы увидим, в вашей системе имеются COM-объекты, для которых полные имена не очевидны. Я советую вам посмотреть информацию об этом в Microsoft MSDN или одной из множества книг о COM. Кроме использования Excel в качестве набора данных для создания отчетов, в повседневных задачах ИТ-администрирования вы можете применять Visio для графического отображения системных значений, автоматизировав эту задачу с помощью Windows PowerShell. В каталоге издательства MS Press вы найдете несколько книг, действительно хорошо описывающих COM-объекты Visio. Однако давайте вернемся к нашему примеру с Excel. Для добавления данных в Excel нам нужна рабочая книга. Поскольку мы вошли в мир COM, нам следует пользоваться синтаксисом COM. Windows PowerShell поможет нам сохранить все, что мы делаем, достаточно простым. Мы можем посмотреть синтаксис, используя $a | Get-Member. Команда Get-Member выводит полный список атрибутов и методов и для COM-объектов. Просто от таких приложениях, как Excel, следует ожидать большего, чем маленькие объекты, которые мы видели раньше. Метод Workbooks.Add() создаст для нас новую рабочую книгу. Нам следует также иметь возможность загрузить существующую рабочую книгу. Для этого необходимо указать путь. Но мы просто создадим новую рабочую книгу из ничего: $b = $a.Workbooks.Add() Возможно, при создании книги Excel вы получите сообщение об ошибке вида «Error: 0x80028018 (-2147647512) Description: Old Format or Invalid Type Library». Эта проблема описана в статье № 320369 из базы знаний Microsoft. Обычно эта ошибка возникает, если Excel установлен на языке (например, English (US)), отличающемся от региональных настроек Windows (например, English (UK))). Это ошибка в объекте Excel. Во время написания этой книги Microsoft еще не выпустила исправления этой ошибки. В качестве временного варианта в этом случае для тестирования измените региональные настройки в параметрах системы на English (US) и перезапустите Windows PowerShell. После этого пример для Excel должен работать без ошибок. Листы, входящие в рабочую книгу, создаются автоматически. Мы выберем первый: $c = $b.Worksheets.Item(1) Если мы хотим записать что-то на лист, это следует делать не в лист, а в ячейку на листе Excel. Это означает, что нам необходимо ввести строку: $c.Cells.Item(1,1) = "Windows PowerShell rocks!" И это все. Наша запись в Excel готова. Вы не верите? Хорошо, давайте выведем Excel на экран, можете посмотреть сами. Команда $a.Visible = $True задает атрибуту «Visible» объекта Excel значение $true. И как по волшебству Excel показывает нам результат. Так же, как атрибут «Visible», мы можем вызывать методы (функции) Excel и использовать их в наших целях. Вы можете, разумеется, догадаться, что делает следующая строка: $b.SaveAs(".\Test.xls") Если вас это удивляет: нет, мы здесь сохраняем не Excel, а соответствующую рабочую книгу Excel. Нас интересует файл XLS, а не программа. Разумеется, эта упрощенная демонстрация. Мы не показали в подробностях , как получить информацию при работе с Excel. Знаете ли вы, что наборы таблиц Excel называются рабочими книгами? И как следует использовать команду «SaveAs» и ее синтаксис? Все это доступно через COM-объекты, и для изучения этого материала вы можете использовать любые источники информации о COM, чтобы использовать эти знания потом в Windows PowerShell. Get-Member всегда будет для вас главным источником подсказок. Поскольку мы говорим только об инструменте Windows PowerShell, я ограничусь использованием информации, не раскрывая ее источник. В конце мы должны очистить и закрыть Excel, если не собираемся ничего делать вручную: $a.Quit() Если хотите, попытайтесь выполнить следующее небольшое упражнение: D2: Создайте список всех служб и введите имена и статусы служб в таблицу Excel. Подсказка: Используйте приведенный выше пример для создания объекта Excel и присвоения его переменной. Чтобы указать строку в таблице Excel, мы используем отдельную переменную $i. Используйте сценарий для вывода служб разными цветами и замените строку с выводом цветом на запись $c.Cells.Item($i,1). Не забывайте увеличивать $i после каждой строки, например с помощью выражения $i = $i + 1. Вы можете вводить в одну строку несколько команд, используя точку с запятой «;». Сохраните результаты из Excel в файле XLS, но пожалуйста, автоматически, с помощью своего сценария, а не вручную, через меню Excel. В результате вы обнаружите, что статус служб выводится в Excel в виде числа. Дружественный Windows PowerShell заменяет эти числа текстом «running» или «stopped», который более удобен для пользователя. Рисунок 14: Вывод служб и их статуса в Excel 2007. Также используется специальный формат Excel 2007 для вывода значений статуса в виде значков, а не чисел. Если на вашем ПК не установлен Excel, вы можете использовать другое упражнение, использующее Internet Explorer. Вместо ввода данных в ячейку мы перейдем на веб-сайт. По сравнению с ранее показанным сценарием для чтения RSS нам потребуется только один дополнительный шаг: при автоматическом чтении ленты RSS будем искать в заголовке ключевые слова и автоматически вызывать веб-страницы. Навигация с дивана никогда еще не была такой простой. Сценарий начинается, как и сценарий для Excel, с вызова new-object: $ie = New-Object -Comobject InternetExplorer.application В этом случае новый объект также изначально невидим, и как и для сценария Excel, для этой проблемы имеется очень простое решение: $ie.Visible = $True Чтобы просмотреть возможности, предоставляемые объектом Internet Explorer, мы также используем командлет Get-Member: $ie | Get-Member Чтобы упростить работу, мы будем искать по популярному веб-сайту: $ie.Navigate(http://www.microsoft.com/powershell) Если хотите, можно объединить этот сценарий со сценарием чтения RSS. Вы увидите множество интересных ссылок и заголовков. Возьмите список заголовков, проведите поиск ключевых слов, и при их обнаружении перейдите на нужную страницу. В нашем курсе мы еще не рассматривали поиск ключевых слов в списке заголовков; воспользуйтесь для получения дополнительных сведений справкой Windows PowerShell. В этой книге я не буду приводить решения этой задачи. Работа с журналами сообщений В завершение наших практических упражнений в этой книге мы кратко рассмотрим журналы сообщений. Windows PowerShell обеспечивает доступ к журналам сообщений с помощью довольно сложных методов. Объекты WMI, .NET и COM имеют для этого множество команд. И даже в Windows PowerShell имеется несколько командлетов, которые всегда могут вам помочь. Наиболее важный из них – это Get-Eventlog. Команда Get-Eventlog -List выводит на экран все журналы системы. Чтобы получить возможность доступа к конкретному журналу , мы можем воспользоваться командлетом Where-Object. Например, доступ к системному журналу производится следующим образом 1 : Get-Eventlog -List | Where-Object {$_.logdisplayname -eq "System"} И хотя это самый простой путь, получившаяся строка кода все равно будет слишком длинной для того, чтобы постоянно ее использовать. Таким образом, если вы хотите работать с записями из журнала сообщений, просто запустите Get-Eventlog, добавив имя нужного журнала. Результат может оказаться слишком объемным, но его вывод можно в любой момент остановить, нажав CTRL-C. Если вы хотите увидеть только последние 20 записей, используйте параметр -newest 20. Разумеется, вы можете заменить 20 на любое другое число. Get-Eventlog system -Newest 3 Get-Eventlog system -Newest 3 | Format-List События можно обрабатывать как обычно в Windows PowerShell, сортировать и группировать. E1: Найдите имя журнала событий Windows PowerShell. Сгруппируйте сообщения по коду ID сообщения, а затем отсортируйте по имени. Вторым шагом выведите список событий с ID 403. Подсказка: Если имя журнала событий содержит пробелы, вводите полное имя в кавычках "o0 p,?2 (q.+/0". E2: Отсортируйте последние 15 записей в системном журнале событий по коду ID в нисходящем порядке. Подсказка: Если вы не можете написать ответ немедленно, прочтите книгу еще раз. 1 В русской версии Windows XP этот журнал называется «Система». Если вы используете эту версию ОС, измените имя в строке сценария. ОТВЕТЫ К УПРАЖНЕНИЯМ Сценарии-решения к упражнениям в этой книге A1 get-process | sort-object CPU A2a get-process | sort-object CPU -descending | select-object -first 10 get-process | sort-object CPU | select-object -last 10 A3 $P = get-process | sort-object CPU -descending | select-object -first 10 A4 $P > .\A4.txt $P | export-csv .\a4.csv $P | export-CliXML .\a4.xml A5 get-service | sort-object status A6 get-service | foreach-object{ write-host $_.name $_.status} A7 get-service | foreach-object{ write-host -f yellow -b red $_.name $_.status} вместо -f можно написать также -foregroundcolor, а вместо -b – -backgroundcolor A8 get-service | foreach-object{ if ($_.status -eq "stopped") {write-host -f green $_.name $_.status}` else{ write-host -f red $_.name $_.status}} A9 get-service | convertto-html |