Макс Тринидад (maxt@putittogether.net) — разработчик SQL Server, имеет звание PowerShell MVP. Работает с унаследованными системами, сетевыми инфраструктурами и базами данных
Наконец-то специалисты по ИТ стали понимать, насколько важной составляющей ИТ-арсенала стала Windows PowerShell. У этой новой технологии много разновидностей, и для изучения их всех требуется немало времени. Но задачу можно существенно облегчить благодаря многочисленным Интернет-сообществам интересующихся PowerShell. Информацию можно найти в книгах, фильмах, конференциях и блогах по всему Интернету. Причем она доступна не только ИТ-администраторам: любой желающий может изучать и использовать PowerShell.
Теперь всем известно, что PowerShell — превосходный инструмент для автоматизации повторяющихся задач. В этой статье я покажу, как можно применять PowerShell для подготовки административных отчетов. Для начала должно быть сделано следующее.
* Необходимо установить PowerShell 2.0 с интегрированной средой сценариев (ISE) на сервере.
* Можно использовать редактор интегрированной среды сценариев PowerShell.
* Необходимо установить Microsoft Office, чтобы открывать файлы в формате значений с разделением запятыми (CSV) в Microsoft Excel.
PowerShell Version 2.0 уже входит в состав Windows 7 и Windows Server 2008 R2. Для предшествующих операционных систем, таких как Windows Vista с пакетом обновления 1 (SP1), Windows XP SP3, Windows Server 2008 SP1 и Windows Server 2003 SP2 необходимо загрузить Windows Management Framework 2.0 RTM, чтобы получить PowerShell 2.0.
Начало работы
Приступая к написанию сценария, воспользуйтесь бесплатным редактором PowerShell ISE. Выберите Start, All Programs, Accessories, Windows PowerShell ISE, как показано на экране 1.
Экран 1. Интегрированная среда сценариев PowerShell |
Но прежде чем начать создавать и выполнять сценарии, необходимо приобрести некоторые знания о политике выполнения PowerShell. По умолчанию эта политика имеет значение Restricted, то есть PowerShell не выполняет сценариев. Важно понять, что единственное назначение политики выполнения PowerShell — предотвратить нанесение вреда компьютеру. Политика не предназначена для борьбы с взломщиками или вирусами. В большинстве случаев достаточно присвоить политике выполнения сценариев значение RemoteSigned, чтобы получить возможность работать со сценариями PowerShell:
Set-ExecutionPolicy RemoteSigned
В Windows Server 2008 или Windows Vista и более новых версиях эту команду необходимо выполнять в сеансе с расширенными правами.
Чтобы узнать больше о назначении политики выполнения, воспользуйтесь командой:
Help About_Execution_Policy -Full
В PowerShell содержится множество справочной информации. Вот еще одна команда, отображающая список содержимого справки, как показано на экране 2:
(get-help About_*) | Select name | More
Экран 2. Содержимое справки PowerShell |
Все эти команды известны как однострочные команды PowerShell.
Выполнив начальную подготовку, можно приступать к практическому сценарию. Предположим, что ИТ-менеджер выполняет аудит и запрашивает административный отчет о серийном номере операционной системы и IP-адресе трех конкретных компьютеров: Server1, Desktop1 и Server2. Необходимо выполнить следующие шаги.
- Ввод: сохранение имен компьютеров.
- Обработка: сбор информации с использованием Get-WMIobject.
- Вывод: создание CSV-файла для Excel с помощью Export-CSV.
- Автоматизация: объединение всех действий.
Ввод: сохранение имен компьютеров
Во-первых, нужно сохранить имена трех выбранных компьютеров в переменной PowerShell:
$ComputerList = @(«Server1»,"Desktop1","Server2"); $ComputerList.gettype()
Как мы видим, имя переменной PowerShell начинается со знака доллара ($). Эта переменная представляет собой коллекцию объектов Microsoft. NET Framework. Сохранение нескольких значений имен компьютеров, заключенных в кавычки («) и разделенных запятыми — самый простой способ создать массив строк, содержащий список. Чтобы проверить тип переменной, созданной в PowerShell, можно добавить метод. NET. gettype() к концу переменной.
Если список компьютеров представлен текстовым файлом, можно воспользоваться следующей командой для создания переменной $ComputerList:
$ComputerList = Get-content c:\temp\ComputerList.txt
Эта команда автоматически создает тип массива строк PSObject и не составляет труда хранить текстовый файл на локальном или сетевом диске.
Обработка: сбор информации с использованием Get-WMIobject
На данном этапе видно, насколько успешно PowerShell собирает информацию. В данном примере используется команда Get-WMIObject. Вы можете больше узнать о любой команде с помощью команды Help. Действуя по запросу менеджера, мы выяснили, что необходимо использовать два класса WMI для подготовки отчета, который был назван Win32_OperatingSystem, и один запрос WMI для получения IP-адресов компьютеров.
Подготовим однострочную команду. Выполним команду Get-WMIobject на локальной системе, создав переменную PSObject. Сохранив результаты в переменной, можно задействовать команду Get-Member для отображения всех значений, сохраненных в этом объекте. NET, как показано на экране 3.
$SavedAuditOS = Get-WMIobject -Class Win32_OperatingSystem $SavedAuditOS | GM -MemberType Property
Экран 3. Отображение значений в объекте .NET |
Символ (|) используется для передачи результатов в другую команду, в данном случае GM. GM — псевдоним команды Get-Member, которая упрощает поиск и отображение всех полей (или свойств), хранящихся в недавно созданной переменной.
Из переменной $SavedAuditOS выбираем свойства CSName, SerialNumber и Name. Ниже приводится однострочная команда для показа выбранных свойств:
$SavedAuditOS | Select-Object CSname, SerialNumber, Name | FT -AutoSize
Переменная передается двум другим командам: Select-Object и FT (псевдоним для Format-Table). Команда Select-Object помогает отображать свойства PSObject. Команда Format-Table позволяет представить результаты в виде отформатированной таблицы и с помощью параметра -AutoSize удаляет лишние пробелы между отображаемыми столбцами.
Переходим к получению информации об IP-адресе. Применяя команду Get-WMIobject, мы избираем другой подход, указав параметр WMI -Query:
$SavedAuditIPAddr = Get-WmiObject ` -query "SELECT * FROM Win32_PingStatus WHERE Address='$MyMachineName'» ` | select StatusCode, IPv4Address | ft -auto;
Этот фрагмент исходного текста считается однострочным, хотя в нем использован оператор (`), чтобы разбить строку и сделать ее более удобной для восприятия. Кроме того, точку с запятой (;) можно использовать для указания конца строки. В строке WMI -Query обязательно измените переменную, следующую за Address=, указав имя компьютера.
Обратите внимание, что для сбора информации используется Win32_PingStatus; Test-Connection не применяется, так как команда возвращает данные, только если можно проверить компьютер с помощью команды ping. Кроме того, командную строку можно немного сократить:
Get-WmiObject Win32_PingStatus -filter «Address=""$MyMachineName""»
Создание CSV-файла для Excel с помощью Export-CSV
Это последний элемент мозаики, который позволит создать CSV-файл для Excel. Для этого потребуется только одна команда PowerShell с использованием ранее созданной переменной $SavedAuditOS:
$SavedAuditOS | Export-CSV -Path C:\temp\TestReport.csv -NoTypeInformation; ii C:\temp\TestReport.csv;
Это еще одна однострочная команда, в которую входит команда ii (псевдоним для Invoke-Item). С помощью этой команды можно открыть файл с использованием соответствующей прикладной программы, в данном случае Excel. В большинстве случаев Excel — программа, выбираемая по умолчанию для просмотра CSV-файлов. Учтите, что если CSV-приложение не установлено, то вместо Invoke-Item придется использовать блокнот Notepad. Параметр -NoTypeInformation исключает дополнительную информацию о данных, добавленных в экспортированный CSV-файл.
Автоматизация: объединение всех действий
Выше были показаны шаги, с помощью которых проще понять, как работает команда. Но есть еще один фрагмент мозаики. Имеется три переменные: в одной хранится список компьютеров, в двух других — информация WMI о компьютерах. Далее мы сможем убедиться в исключительных возможностях PowerShell.
Нужно объединить всю информацию о компьютере в одной переменной с именем $AuditOSInfo. Эта переменная представляет собой хэш-таблицу PowerShell, в которой содержатся результаты обоих процессов WMI: Win32_OperatingSystem и запроса Win32_PingStatus. Затем с помощью инструкции ForEach мы пройдем по именам всех компьютеров, построив хэш-таблицу, содержащую всю информацию.
Внутри команды ForEach будут созданы две переменные:
* $SavedAuditOS — собирает информацию Win32_OperatingSystem из выбранного компьютера;
* $SavedAuditIpAddr — собирает информацию IPAddress запроса WMI из выбранного компьютера.
Внутри программного кода ForEach строится объект $MyPSObject хэш-таблицы для объединения информации каждого компьютера и добавления к ней переменной $AuditOSInfo. Наконец, после сбора всей информации с помощью команды Export-CSV создается выходной CSV-файл. В листинге 1 приведен полный исходный текст сценария. Сценарий формирует тестовый административный отчет, показанный на экране 4.
Экран 4. Тестовый административный отчет |
О пользовательском объекте хэш-таблицы
Это ядро нашего процесса. Здесь данные объединяются в одном пользовательском объекте, известном как хэш-таблица. Можно упорядочить результаты по собственному желанию, объединить данные из различных источников и при необходимости изменить метку значения данных. Все это происходит в параметре -Property, когда создается новый объект PSObject, как показано в исходном тексте листинга 2.
Обратите внимание, что при создании свойства OSName используется передовой метод, чтобы получить значение описания операционной системы, сохраняемое в переменной $SavedAuditOS. Назначьте свойству имя с использованием метода String Split(). Это свойство содержит три значения, разделенных символом (|), но нам нужно лишь одно, определенное в исходном тексте как элемент 0:
OSName = $SavedAuditOS.Name.Split(«|")[0];
Одно из трех значений будет храниться в свойстве OSName пользовательской хэш-таблицы. Принимая эту строку с несколькими значениями и разделительными символами (|), мы используем метод Split("|») с последующей квадратной скобкой [0], указывающей на необходимость извлечь первый элемент строки.
Ниже приводится пример строки с несколькими значениями, содержащей три разграниченных элемента:
$Str_name = «Microsoft Windows 2008R2|C:\Windows|\Device\ Harddisk0\Partition2» Element # -> [0] -> [1] -> [2]
Используя тестовую строку $Str_Name.Split(«|")[0], мы получаем только первый элемент, выбирая строковое значение Microsoft Windows 2008 R2. Как видно, используется строковый метод Split(). NET в случае, когда нужно извлечь фрагмент данных с разделительным символом.
Творческий подход
Это несложный сценарий, предназначенный для выполнения с настольного компьютера. Совсем не обязательно иметь в своем распоряжении сервер, чтобы задействовать PowerShell. Можно расширить логику или добавить программный код, чтобы увеличить количество полей. Можно даже подготовить сценарий для передачи по электронной почте сообщений с прикрепленным файлом CSV или создать плановую задачу для запуска сценария в определенный день и время. Следует отметить, что при создании пользовательских хэш-таблиц свойства объекта. NET расположены не в том порядке, в котором они были изначально определены. В версии 2.0 это нормально. Просто воспользуйтесь командой Format-* или Select-Object и введите свойства в том порядке, в котором их следует отображать.
PowerShell стал для администраторов важным инструментом, игнорировать который нельзя. Непременно выделите время для его освоения.
Листинг 1. Создание выходного файла CSV
############################################## ## AdminOSReport.ps1 ## 12/04/2011 ############################################## ## — Создание переменной со списком имен компьютеров: $ComputerList = "WIN8Server1»,"WIN764SQL01","W764SQL02Merged"; ## — Задача сбора и объединения данных: [Array]$AuditOSinfo = ` ForEach($ComputerName in $ComputerList) { ## — Получение информации WMI: $SavedAuditOS = get-wmiobject -Class Win32_OperatingSystem ` -ComputerName $ComputerName; $SavedAuditIPAddr = Get-WmiObject -query ` «SELECT * FROM Win32_PingStatus WHERE Address = '$ComputerName'»; ## — Шаг объединения информации WMI в хэш-таблицу: $MyPSObject = New-Object PSObject -Property @{ ComputerName = $SavedAuditOS.csname; IPv4Address = $SavedAuditIPAddr.IPv4Address; IPStatusCode = $SavedAuditIPAddr.StatusCode; SerialNumber = $SavedAuditOS.SerialNumber; OSversion = $SavedAuditOS.Version; SystemDescrip = $SavedAuditOS.Description; OSName = $SavedAuditOS.Name.Split(«|")[0]; }; $MyPSObject; }; ## — Формирование и открытие отчета: $AuditOSinfo | Export-CSV -Path C:\temp\TestReport.csv -NoTypeInformation; ii C:\temp\TestReport.csv;
Листинг 2: Создание пользовательского объекта хэш-таблицы
## — Шаг объединения информации WMI в хэш-таблицу: $MyPSObject = New-Object PSObject -Property @{ ComputerName = $SavedAuditOS.csname; IPv4Address = $SavedAuditIPAddr.IPv4Address; IPStatusCode = $SavedAuditIPAddr.StatusCode; SerialNumber = $SavedAuditOS.SerialNumber; OSversion = $SavedAuditOS.Version; SystemDescrip = $SavedAuditOS.Description; OSName = $SavedAuditOS.Name.Split("|»)[0]; };