Отправка оповещения по электронной почте из монитора производительности с помощью сценария PowerShell

Я создал предупреждение в системном мониторе (Windows Server 2008 R2), которое должно срабатывать всякий раз, когда \ Processor (_Total) \% Processor Time больше 10 (небольшое значение, чтобы гарантировать, что условие для отправки предупреждения всегда выполняется). Вы можете увидеть свойства задачи оповещения на изображении.

введите описание изображения здесь

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

  • Начать задание: На мероприятии
  • Настройки: Основные
  • Журнал: Система
  • Источник: процессор

Действия (а это та часть, которую я не знаю, верна ли она) имеют следующие настройки:

  • Действие: запустить программу
  • Программа / сценарий: путь к сценарию PowerShell для отправки электронного письма.

Код PowerShell следующий ($ name, $ date, $ counter, $ threshold, $ value должны поступать из свойств задачи оповещения, заданных сборщиком данных Performance Monitor, как на изображении выше):

function SendMail ($name, $date, $counter, $threshold, $value) {
  $MailMessage = New-Object Net.Mail.MailMessage
  $MailMessage.To.Add("[email protected]")
  $MailMessage.From = "[email protected]"
  $MailMessage.Subject = "ALERT - Performance Monitor"
  $MailMessage.IsBodyHtml = $True

  $MailMessage.Body = @"
    <html><head></head><body>
    The following counter needs attention:<BR><BR>
    Name: $($name)<BR>
    Date: $($date)<BR>
    Counter: $($counter)<BR>
    Threshold: $($threshold)<BR>
    Actual Value: $($value)<BR>
    <FONT face=Courier>$($html)</FONT>
    <BR>
    --- Automatically generated with SENDMAIL function ---
    </body>
    </html>
"@

  $SmtpClient = New-Object Net.Mail.SmtpClient("blah.bleh")
  $SmtpClient.Send($MailMessage)
}

Как только задача запущена, у меня в истории будет следующее: «Задача запущена», «Действие начато» и «Создан процесс запроса». Однако электронное письмо никогда не отправляется.

Я попытался отправить электронное письмо с помощью Действие: Отправить электронное письмо, и оно сработало. Кто-нибудь знает, что может быть не так?


person Anna    schedule 27.08.2013    source источник
comment
Вы уверены, что все параметры передаются в скрипте правильно? Другое дело, если вы используете powershell v3, вы можете использовать командлет send-mailmessage - stackoverflow.com/a/17456077/581922   -  person Mitul    schedule 28.08.2013
comment
@Mitul: Вы имеете в виду параметры $ name, $ date и т. Д.? Если да, то как я могу это проверить? Если вы имеете в виду такой параметр, как электронная почта, smtp-сервер и т. Д., Я использую то же, что и в действии: отправить электронное письмо (с той разницей, что в сценарии мой smtp-сервер запускается с SMTP. (И к сожалению, я не использую v3 :(   -  person Anna    schedule 28.08.2013
comment
Опубликованный вами код определяет функцию, но я не вижу, чтобы вы вызывали эту функцию где-либо.   -  person Ansgar Wiechers    schedule 28.08.2013
comment
Чтобы проверить это, закомментируйте все и выведите значения в текстовый файл.   -  person Mitul    schedule 28.08.2013
comment
@Mitul PSv2 имеет Send-MailMessage.   -  person Adi Inbar    schedule 28.08.2013
comment
@Ansgar Wiechers: Как мне вызвать функцию, передающую аргументы задачи? (Извините, я никогда раньше не использовал PowerShell или планировщик задач)   -  person Anna    schedule 28.08.2013


Ответы (1)


По сути, есть две вещи, которые должны решить эту проблему.

  1. Получите параметры предупреждения, правильно переданные в ваш скрипт.
  2. Фактически вызовите функцию, определенную в вашем скрипте.

Начнем с параметров. На вкладке «Задача оповещения» вашего оповещения (на изображении выше) отредактируйте поле «Аргументы задачи» и замените:

{name}{date}{counter}{threshold}{value}

с участием:

"{name}" "{date}" "{counter}" "{threshold}" "{value}"

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

Затем для действия вашей запланированной задачи (названной «Мониторинг процессора») вы должны указать ему, чтобы он ожидал параметры от предупреждения и передавал эти параметры в сценарий PowerShell.

введите описание изображения здесь

Ваше действие правильное, т.е. «Запустить программу».

В поле «Программа / сценарий» введите «powershell.exe» (или найдите полный путь).

В поле Добавить аргументы введите следующее:

-File C:\path\to\your\PowerShell\scripts\perfmon_send_email.ps1 $(Arg0)

Где perfmon_send_email.ps1 - это файл сценария, содержащий вашу функцию SendMail (), как описано выше.

Этот бит был немного привередливым, поэтому могут быть другие способы его настройки, но явное использование параметра -File имело значение для моих тестов. Часть $(Arg0) - это то, что заменяется строкой параметра из Alert, когда запланированная задача выполняет PowerShell для запуска вашего скрипта.

Это должно сделать параметры оповещения доступными для вашего сценария PowerShell. Теперь все, что вам нужно сделать, это вызвать функцию, которую вы уже определили. Добавьте следующее в конец вашего скрипта (после определения функции):

# Get parameter values by position and pass them to the SendMail() function.
SendMail $args[0] $args[1] $args[2] $args[3] $args[4]

$args - это массив, содержащий значения параметров, переданные в файл сценария, вызываемый из командной строки, что мы и настроили для выполнения запланированной задачи.

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

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

person Matt    schedule 28.08.2013
comment
Ух ты! Большое спасибо @Matt за подробное объяснение !! Я очень ценю это! Однако я не могу проверить, работает ли он, потому что при запуске моего скрипта у меня появляется следующее сообщение об ошибке: Исключение при вызове Отправить с 1 аргументом (ами): Ошибка отправки почты. (для строки $ SmtpClient.Send ($ MailMessage)). Что вызывает это и как это исправить? - person Anna; 29.08.2013
comment
Неважно! Проблема заключалась в том, что я установил своим smtp-клиентом SMTP.blah.bleh, тогда как на самом деле он должен быть просто blah.bleh :) - person Anna; 29.08.2013
comment
Итак, я наконец получил сценарий для правильной отправки электронной почты (УРА !!!). Но параметры не передаются по электронной почте. Итак, это тело письма: ‹html› ‹head› ‹/head› ‹body› = 0D = 0A Следующий счетчик требует внимания: ‹BR› ‹BR› == 0D = 0AName: $ (Arg0) ‹BR› = 0D = 0ADate: ‹BR› = 0D = 0ACounter: ‹BR› = 0D = 0AThreshold: = ‹BR› = 0D = 0A Фактическое значение: ‹BR› = 0D = 0A ‹FONT face = 3DCourier› ‹/FONT› = 0D = 0A = 0D = 0A ‹BR› == 0D = 0A --- Автоматически создается с помощью функции SENDMAIL --- = 0D = 0A = ‹/body› = 0D = 0A ‹/html›. Счетчик должен быть% загруженности процессора, порог должен быть 10, а фактическое значение должно быть около 50. Есть мысли? - person Anna; 29.08.2013
comment
Я обнаружил, что электронное письмо отправляется только после того, как я запускаю задачу, а не когда он обнаруживает, что счетчик производительности превышает предел (поэтому ни одно из значений не отображается в электронном письме). Первоначально у меня была задача в планировщике задач, которая должна запускаться по событию, при этом журнал был системой, а источник - процессором, и, конечно же, это не сработало. Затем я изменил журнал на приложение и источник на PrefCtrs, но счетчик все равно срабатывает только при запуске задачи. Что могло быть не так? - person Anna; 29.08.2013
comment
Я не знаю, имеют ли значение значения Log и Source, или нет. Я почти уверен, что дело просто в названии; возможно, убедитесь, что имя вашей задачи точно соответствует значению, указанному на вкладке задачи предупреждения в предупреждении, то есть мониторинг процессора в шапке экрана выше. - person Matt; 29.08.2013
comment
Я не уверен, было ли это решением, потому что я изменил имя задачи на ProcessorMonitoring (без пробелов), и он работает. Он отправляет электронное письмо каждый раз, когда запись регистрируется в журналах (то есть даже когда нет данных для сборщиков данных), но я обработал это в сценарии (если аргумент не пуст, отправьте электронное письмо). Спасибо @Matt за помощь :) - person Anna; 30.08.2013