четверг, 9 декабря 2010 г.

HTML-отчеты в Exchange 2010

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

Начнем с азов

Думаю ни для кого не секрет, что начиная с версии Microsoft Exchange 2007, архитектурная модель сервера базируется на Microsoft .NET Framework. В результате теперь главную роль играют командлеты PowerShell, которые покрывают все функциональные возможности сервера, а задача графической консоли сводится лишь к визуализации их использования; в отличие от более ранних версий, где все было с точностью до наоборот. Раз так, то получается, что в консоли PowerShell мы можем получить абсолютно любую информацию, касающуюся состояния сервера Exchange.

Структура команд

Команда в PowerShell строятся из трех элементов – глагола (Get-, Set-, New-, Remove- и т.п.), существительного (Mailbox, MailboxDatabase и т.п.) и списка параметров (-Identity, -Name, -Server, -User и т.п.), например:

Get-Mailbox –Identity User

Выведет на экран информацию о почтовом ящике пользователя User.

Для получения отчетов нам понадобятся только Get-командлеты, они ни чего не изменяют в конфигурации, а лишь считывают данные из указанных объектов.

Получение помощи

Если вы не уверены в синтаксисе той или иной команды, то вам поможет команда Get-Help, которая выведет подробную справку с примерами. Воспользоваться ей можно, например так:

Get-Help Get-Mailbox –full

Посмотреть список всех доступных команд можно при помощи Get-Command. Вывести все доступные Get-командлеты можно следующим образом:

Get-Command Get-*

Если вы не знаете какой командлет используется для выполнения конкретного действия, но знаете как это действие выполнить в Exchange Management Console, то консоль сама вам подскажет выполняемую команду:

Во-первых, при внесении каких-либо изменений, вы всегда можете воспользоваться кнопкой, расположенной в левой нижней части окна, при нажатии на неё будет выведена команда, которая будет выполнена после нажатия кнопки ОК.

clip_image003

Рис.1: Просмотр команды, планирующейся к выполнению.

Во-вторых, если вы выполняете какое-либо действие при помощи мастера, то на последнем его шаге будет выведена информация по результатам выполнения определенной команды и сама команда. Результаты всегда можно скопировать при помощи сочетания клавиш Ctrl+C и далее использовать.

Конвейеры и форматирование вывода

Если вы выполните предыдущую команду

Get-Mailbox –Identity User

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

  • Детальный список - Format-List
  • Таблица - Format-Table
  • Две колонки - Format-Wide

Разрешается сокращать эти команды до FL, FT и FW соответственно.

Чтобы передать вывод одной команды на вход другой применяются конвейеры. Для вставки конвейера используется горизонтальная черта | . Например, чтобы получить действительно полный список параметров почтового ящика, необходимо воспользоваться следующей конструкцией:

Get-Mailbox –Identity User | FL

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

Get-Mailbox –Identity User | FL Name,Alias,*Quota*

В результате будет выведено значение только имени, псевдонима и всех параметров, в которых встречается слово Quota.

Вместе с функцией фильтрации данных очень удобно использовать функцию сортировки, она сильно облегчит вам визуальный анализ полученных результатов. Для сортировки вывода используется командлет Sort-Object, в качестве параметра у которого необходимо указать поле по которому вы хотите отсортировать вывод. В результате команда будет выглядеть примерно так:

Get-Mailbox –Identity User | FL Name,Alias,ArchiveQuota | Sort-Object ArchiveQuota

Научившись получать данные, фильтровать и сортировать их вывод, надо научиться сохранять эти данные в файл. Для перенаправления вывода команды в файл используется также конвейер с командой Out-File. Заменить эту конструкцию можно символом > .

Get-Mailbox –Identity User | FL Name,Alias,*Quota* | Out-File c:\test.txt

аналогично

Get-Mailbox –Identity User | FL Name,Alias,*Quota* > c:\test.txt

Примечание: Если не указан путь к файлу, то файл будет сохранен в каталог, откуда запущенна консоль PowerShell.

Конвертируем в HTML-формат

Разобравшись с тем, как создавать отчеты, давайте перейдем к вопросу их форматирования.

Для конвертации вывода команд PowerShell в HTML-формат используется конвейер с командой ConvertTo-Html.

Примечание: Существует ещё конвертер в CSV формат ConvertTo-Csv, но о нем мы говорить не будем.

Для демонстрации возможностей давайте разберем конкретную задачу:

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

Для решения поставленной задачи воспользуемся командлетом Get-MailboxStatistics, на вход которой отправим все почтовые ящики. В результате команда будет выглядеть следующим образом:

Get-Mailbox | Get-MailboxStatistics | ConvertTo-Html DisplayName, Servername, Database, TotalItemSize > c:\Report.htm

Get-Mailbox | Get-MailboxStatistics | ConvertTo-Html DisplayName, Servername, Database, TotalItemSize | Out-File c:\Report.htm

Get-Mailbox | Get-MailboxStatistics | Select-Object DisplayName, Servername, Database, TotalItemSize | ConvertTo-Html > c:\Report.htm

Все три команды дадут идентичный эффект, результатом которого станет генерация файла Report.htm в корне диска C: (рис.2).

clip_image005

Рис.2: Сгенерированный отчет.

Красиво? Да!, но не достаточно, такой отчет на стол начальнику не положишь. Следовательно, разбираемся дальше.

Использование HTML-тэгов

Раз речь зашла о конвертации в HTML, то логично было бы предположить, что существует возможно использовать HTML-тэги при генерации документов. Такая возможность действительно есть. Давайте посмотрим, как можно «украсить» полученную таблицу.

Во-первых, мы можем использовать тэги типа –Head, -Body, -Title и т.п., указав их сразу после командлета ConvertTo-Html. Например так:

Get-Mailbox | Get-MailboxStatistics | ConvertTo-Html –Title “Mega Report” –Body “<H2>Information about mailboxes</H2>” DisplayName, Servername, Database, TotalItemSize > c:\Report.htm

В результате получиться отчет, показанный на рис.3.

clip_image007

Рис.3: Отчет с заголовками.

Уже лучше, но можно и ещё кое-что подправить. Например, гораздо удобнее будет, если табличка с данными будет иметь очерченные границы и будет выделена другим цветом.

Для этого воспользуемся стилями. Для вставки стилей в HTML используется конструкция <style>…</style>. В данном случае будет уместнее собрать стили документа в одну составную переменную, которую нужно будет в последствии использовать в командлете ConvertTo-Html. Сделаем это следующим образом:

$Style = ”<style>”

$Style = $Style + "BODY{background-color:#DCE5F1;}"

$Style = $Style + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"

$Style = $Style + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#4D81BE}"

$Style = $Style + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#B8CBE3}"

$Style = $Style + ”</style>”

Далее указываем переменную $Style в качестве параметра для тэга -Head в командлете ConvertTo-Html:

Get-Mailbox | Get-MailboxStatistics | ConvertTo-Html –Title “Mega Report” -Head $Style –Body “<H2>Information about mailboxes</H2>” DisplayName, Servername, Database, TotalItemSize > c:\Report.htm

Проще всего сохранить этот листинг в виде отдельно PowerShell скрипта, например Report.ps1 (см.рис.4).

clip_image009

Рис.4: Цветовое оформление отчетов.

Примечание: Коды цветов для HTML можно легко найти в сети Интернет.

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

1. Сохраняем в переменную $Data массив с нужными данными, например:

$Data = Get-Mailbox | Get-MailboxStatistics | Select-Object DisplayName, Servername, Database, TotalItemSize

2. Запускаем скрипт ReportTemplate.ps1, со следующим содержимым:

$Style = ”<style>”

$Style = $Style + "BODY{background-color:#DCE5F1;}"

$Style = $Style + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"

$Style = $Style + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#4D81BE}"

$Style = $Style + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#B8CBE3}"

$Style = $Style + ”</style>”

$Data | ConvertTo-Html –Title “Mega Report” -Head $Style –Body “<H2>Report:</H2>” > c:\Report.htm

В результате получаем следующую картину:

image

Рис.4: Использование скрипта ReportTemplate.ps1

Мы можем записать в переменную $Data различные наборы данных, на которые, впоследствии, можно просто наложить шаблон и получить красивую HTML-страничку.

Заключение

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

15 комментариев:

Анонимный комментирует...

День добрый,
как добавить контакты с внешними адресами в Exchange?

Алексей Богомолов (Alexx) комментирует...

А какая связь с темой статьи?
Контакты можно создать в разделе Настройка получателей - Почтовые контакты.

Анонимный комментирует...

Понятно, а если их много, автоматизировать можно как-то?

Алексей Богомолов (Alexx) комментирует...

А если много - то PowerShell вам в помощь!

Анонимный комментирует...

А что именно прописать подскажите.

Анонимный комментирует...

А как правильно сделать сортировку по Обьему.

Анонимный комментирует...

Алексей, вы можете привести пример экспорта/импорта списка контактов (почтовых ящиков) в Exchange 2010

Алексей Богомолов (Alexx) комментирует...

Так всеже речь идет про контакты, или почтовые ящики?
Что касается создания списка контактов либо почтовых ящиков из csv файла (импорта) - у меня есть скрипты. Напишите мне на электронку, я с вами поделюсь.
Что касается экспорта, то тут проблем не вижу. Используйте командлеты Get-Mailbox и Get-MailContact.

Анонимный комментирует...

Просто здорово. Столько времени тратил. а все так просто и доступно объяснил

Анонимный комментирует...

Алексей, добрый день. Не подскажите, как создать отчет по сообщениям в конкретном почтовом ящике - таблицу типа дата/время, кому/от, заголовок, размер, с сортировкой по "кому" ? В Get-Mailbox ничего похожего не нашёл, наверное надо как - то по - другому.. Спасибо.

Алексей Богомолов (Alexx) комментирует...

Воспользуйтесь вот этим скриптом http://gallery.technet.microsoft.com/scriptcenter/bb94b422-eb9e-4c53-a454-f7da6ddfb5d6?SRC=Home

Анонимный комментирует...

Добрый день.
В списке баз данных exchange есть отключенная. Когда скрипт доходит до ящиков, размещенных в ней - спотыкается и html ломается.
Есть параметр -database для обработки данных конкретной БД, но в какое место его указывать - что то не соображу.
Подскажите пож-та. Спасибо.

Алексей Богомолов (Alexx) комментирует...

В самое начало - Get-Mailbox -Database 123 | Get-...

Анонимный комментирует...

а не подскажете, как скорректировать Ваш отчет.
Мне нужно получить поля Company и Departament.
а они есть только в выводе команды get-adUser.

Анонимный комментирует...

до использования скрипта тег -Title работал. после - нет.

Отправить комментарий