使用PowerShell脚本从性能监视器发送电子邮件警报

Ann*_*nna 5 email powershell alert performance-monitor windows-server-2008-r2

我在性能监视器(Windows Server 2008 R2)中创建了一个警报,应该在\处理器(_Total)\%处理器时间超过10时触发(一个小值只是为了保证始终满足发送警报的条件).您可以在图像中看到警报任务属性.

在此输入图像描述

此外,我还在Task Scheduler中创建了一个新任务,无论用户是否登录,它都将运行,并且它将以最高权限运行.此任务的触发器具有以下属性:

  • 开始任务:在一个事件上
  • 设置:基本
  • 日志:系统
  • 来源:处理器

动作(这是我不知道它是否正确的部分)具有以下设置:

  • 行动:启动一个程序
  • 程序/脚本:发送电子邮件的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)
}
Run Code Online (Sandbox Code Playgroud)

任务启动后,我在历史记录中有以下内容:任务已启动,已启动操作和已创建请求流程.电子邮件从未发送过.

我尝试使用操作发送电子邮件:发送电子邮件,它运行正常.有谁知道什么可能是错的?

Mat*_*att 8

基本上有两件事需要解决,这应该让这对你有用.

  1. 获取正确传递给脚本的警报参数.
  2. 实际上调用脚本中定义的函数.

我们将从参数开始.在警报的"警报任务"选项卡上(如上图所示),编辑"任务参数"字段并替换:

{name}{date}{counter}{threshold}{value}
Run Code Online (Sandbox Code Playgroud)

有:

"{name}" "{date}" "{counter}" "{threshold}" "{value}"
Run Code Online (Sandbox Code Playgroud)

您的参数基本上被解析为空格分隔的字符串值,因此我们在每个单独的参数标记周围添加双引号来处理包含空格的值,并且我们在每个单独的参数标记之间添加一个空格,以便我们能够告诉下一个参数.

然后,对于计划任务的操作(名为"处理器监视"),您必须告诉它预期警报中的参数并将这些参数传递给PowerShell脚本.

在此输入图像描述

你的行动是正确的,即"开始一个程序".

对于Program/script字段,输入"powershell.exe"(或浏览完整路径).

对于Add Arguments字段,输入以下内容:

-File C:\path\to\your\PowerShell\scripts\perfmon_send_email.ps1 $(Arg0)
Run Code Online (Sandbox Code Playgroud)

perfmon_send_email.ps1包含SendMail()函数的脚本文件在哪里,如上所述.

这个位有点挑剔,所以可能还有其他方法来设置它,但显式使用-File参数对我的测试产生了影响.$(Arg0)当计划任务执行PowerShell以运行脚本时,该部分将被Alert中的参数字符串替换.

因此,应该使PowerShell脚本可以使用Alert参数.现在你所要做的就是调用你已定义的函数.将以下内容添加到脚本的末尾(在函数定义之后):

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

$args 是一个数组,包含传递给从命令行调用的脚本文件的参数值,这正是我们配置要执行的计划任务的内容.

由于我们知道警报将始终以相同的顺序发送相同的值,即名称,日期,计数器,阈值和值,我们可以根据位置从命令行参数中提取它们并将它们传递给SendMail()函数.

请注意,有更强大的方法来处理命令行参数,但这应该足以满足您的需要.