В любой организации где используется Exchange или любое ПО подобного класса требуется вести документацию. К сожалению мы часто забываем это делать. Что приводит порой к самым интересным ситуациям, когда каждые полгода ты тратишь от часа до недели на задачу которую ты уже решал, но не помнишь как.
По идее надо записывать каждую команду которую ты запускаешь, но это сильно замедляет скорость работы, к счастью мы можем автоматизировать слежку за изменениями в конфигурации Exchange используя встроенные средства.
В 2010 Exchange все действия выполняются через вызов powershell команды или скрипта, даже если вы работаете через
EMC или
ECPВ Exchange 2010 разработчики позаботились о нас следующим образом. При вызове Exchange snapin и запуске команды параллельно подгружается агент
Admin Audit Log Agent который записывает данные о том что и как было запущено. Посмотреть логи можно с любого сервера, но их распространение завязано на репликацию в AD.
Итак самое важное:
что он логит по умолчанию - все командлеты изменяющие свойства объектов Exchange;
чего он не логит по умолчанию - Get-*, Search-*, Test-* командлеты;
чего он не логит в принципе - если выполнение команды было прервано ДО старта Admin Audit Log Agent; запуск скриптов и команд в Exchange 2007.
Поля которые они использует можно посмотреть
тут. Там же можно посмотреть и другие параметры настроенные "по умолчанию". Например узнать что события хранятся 90 дней.
Ключевой момент - в SP1 из аудита убрали возможность настроить AdminAuditLogMailbox, этот параметр позволял настроить отправку отчетов при каждой выполненной команде в определенный ящик Exchange.
С одной стороны это ооочень плохо, т.к. нельзя больше одной командой посылать себе уведомления. Взамен можно отправить себе отчет через ECP. НО! Кроме того что ты получаешь отчет в "сыром" XML, так ты еще не можешь получить к нему доступ в OWA, т.к. по умолчанию XML документы в файлах блокируются. *wallbash*
Люблю M$ за нестандартные решения.
С другой стороны это хорошо. Так как позволяет определить какие конкретно уведомления ты хочешь и должен получать. Ну и немного попрактиковаться в PowerShell.
Первое - определим цели.
1. Мы хотим получать отчет о командах запущенных за последний час.
2. Мы не хотим получать отчеты о командах запущенных внутренними системными пользователями, все сервисы запускающие их ведут лог в Application.
3. Отчет должен приходить в удобочитаемом виде.
4. В отчете должно быть отражено следующее: кто, что, над кем, когда, с какими параметрами.
Второе - средства:
1. PowerShell v 2.0 + Exchange 2010 management tools
2. TaskScheduler
3. Командлет
Search-AdminAuditLog4. Командлет
Send-MailMessageСобственно все.
Ну приступим.
#добавляем snapin Exchange 2010, без этого наши exchange командлеты работать не будут
add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010;
#период за который хотим получить отчет
$date = (Get-Date).AddHours(-1);
#собственно массив с отчетом, фильтруем по параметру Caller.
$report = Search-AdminAuditLog -StartDate $date | where {$_.Caller -notlike "SystemUser"};
<# т.к. полученный объект является массивом проще всего - посчитать количество элементов и определить надо ли делать что-то еще или нет#>
if ($report.Count -gt 0) {
#запускаем цикл для каждого элемента в массиве
foreach ($answer in $report)
{
<#свойство CmdletParameters является вложенным массивом, который содержит название и значение параметра (не поверите Name и Value), записываем их в строку#>
foreach ($parametr in $answer.CmdletParameters)
{
<#откуда взялись br? письмо будет отправлено как html, чтобы можно было все красиво отформатировать.#>
$stringParam += "Name: " + $parametr.Name + "<br>Value: " + $parametr.Value + "<br>";
}
#тело отчета, в конец добавляем список переданных параметров
$messageBody += "<br>User: " + $answer.Caller + "<br><font color=red> Launch cmdlet: " + $answer.CmdletName + "</font><br><font color=green>On object: " + $answer.ObjectModified + "</font><br>At time: " + $answer.RunDate.ToString() + "<br>Used params: <br>" + $stringParam;
#не забываем очистить строку содержащую параметры
$stringParam = "";
}
<#если хочется чтобы каждый отчет приходил отдельным письмом убираем этот цикл и помещаем отправку письма внутрь предыдущего. В противном случае - проверяем размер $messageBody и если он больше 0 то отправляем письмо. Передаваемые параметры не привожу.#>
if ($messageBody.Length -gt 0)
{
Send-MailMessage $mailTo $mailSubject $messageBody $mailSmtp -From $mailFrom -Encoding $encoding -BodyAsHtml;
}
<#не забываем очистить строку содержащую тело письма, если для каждого отчета отправляется отдельное письмо помещаем команду внутрь первого цикла.#>
$messageBody = "";
}
Письмо которое получается на выходе
User: Admin (на самом деле здесь путь к объекту в AD ;) )
Launch cmdlet: Set-CASMailboxOn object: mailbox (на самом деле здесь путь к объекту в AD ;) )At time: 25.11.2010 10:45:07
Used params:
Name: ImapEnabled
Value: False
Name: Identity
Value: mailbox (на самом деле здесь путь к объекту в AD ;) )
PS: пока писал нашел "более красивый" вариант
тут, хнык.