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


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

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

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

  • начните задание: по событию
  • Настройки: Основные
  • Log: System
  • Источник: Процессор

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

  • действие: запуск программы
  • Program / script: путь к сценарию PowerShell для отправки сообщения электронной почты.

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

function SendMail ($name, $date, $counter, $threshold, $value) {
  $MailMessage = New-Object Net.Mail.MailMessage
  $MailMessage.To.Add("myemail@blah.bleh")
  $MailMessage.From = "do-not-reply@blah.bleh"
  $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)
}

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

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

1 5

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) - это то, что заменяется строкой параметров из предупреждения когда запланированная задача выполняет 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 (). Обратите внимание, что существуют более надежные способы обработки аргументов командной строки, но этого должно быть достаточно для ваших целей.