Макс Тринидад (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.

 

Интегрированная среда сценариев PowerShell
Экран 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

 

Содержимое справки PowerShell
Экран 2. Содержимое справки PowerShell

Все эти команды известны как однострочные команды PowerShell.

Выполнив начальную подготовку, можно приступать к практическому сценарию. Предположим, что ИТ-менеджер выполняет аудит и запрашивает административный отчет о серийном номере операционной системы и IP-адресе трех конкретных компьютеров: Server1, Desktop1 и Server2. Необходимо выполнить следующие шаги.

  1. Ввод: сохранение имен компьютеров.
  2. Обработка: сбор информации с использованием Get-WMIobject.
  3. Вывод: создание CSV-файла для Excel с помощью Export-CSV.
  4. Автоматизация: объединение всех действий.

Ввод: сохранение имен компьютеров

Во-первых, нужно сохранить имена трех выбранных компьютеров в переменной 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

 

Отображение значений в объекте .NET
Экран 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];
};