По идее надо записывать каждую команду которую ты запускаешь, но это сильно замедляет скорость работы, к счастью мы можем автоматизировать слежку за изменениями в конфигурации 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-AdminAuditLog
4. Командлет 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-CASMailbox
On object: mailbox (на самом деле здесь путь к объекту в AD ;) )
At time: 25.11.2010 10:45:07
Used params:
Name: ImapEnabled
Value: False
Name: Identity
Value: mailbox (на самом деле здесь путь к объекту в AD ;) )
PS: пока писал нашел "более красивый" вариант тут, хнык.
Комментариев нет:
Отправить комментарий