【问题标题】:Send email alert from Performance Monitor using PowerShell script使用 PowerShell 脚本从性能监视器发送电子邮件警报
【发布时间】:2013-08-27 21:08:25
【问题描述】:

我在性能监视器 (Windows Server 2008 R2) 中创建了一个警报,当 \Processor(_Total)\% Processor Time 高于 10 时应触发该警报(一个小值只是为了保证发送警报的条件始终为遇见)。您可以在图像中看到警报任务属性。

此外,我还在任务计划程序中创建了一个新任务,无论用户是否登录,它都会运行,它会以最高权限运行。此任务的触发器具有以下属性:

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

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

  • 操作:启动程序
  • 程序/脚本:用于发送电子邮件的 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)
}

一旦任务开始,我在历史记录中有以下内容:任务开始、动作开始和创建询问过程。但是,电子邮件永远不会发送。

我尝试使用操作发送电子邮件:发送电子邮件,它工作正常。有谁知道可能出了什么问题?

【问题讨论】:

  • 您确定脚本中的所有参数都正确传递了吗?另一件事是,如果您使用的是 powershell v3,那么您可以使用 send-mailmessage cmdlet -stackoverflow.com/a/17456077/581922
  • @Mitul:你的意思是$name、$date等参数吗?如果是这样,我该如何检查?如果您指的是电子邮件、smtp 服务器等参数,我使用的参数与我在操作中使用的相同:发送电子邮件(不同之处在于,在脚本中,我的 smtp 服务器以“SMTP”开头。 (不幸的是,我没有使用 v3 :(
  • 您发布的代码定义了一个函数,但我没有看到您在任何地方调用该函数。
  • 测试它注释掉所有内容并将值输出到文本文件。
  • @Mitul PSv2 有 Send-MailMessage

标签: email powershell alert windows-server-2008-r2 performance-monitor


【解决方案1】:

基本上有两件事情要解决,这应该可以让你工作。

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

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

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

与:

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

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

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

您的操作是正确的,即“启动程序”。

对于程序/脚本字段,输入“powershell.exe”(或浏览完整路径)。

对于 Add Arguments 字段,输入:

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

perfmon_send_email.ps1 是包含上述 SendMail() 函数的脚本文件。

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

因此,这应该使警报参数可用于您的 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 () 功能。

请注意,有 more robust ways 来处理命令行参数,但这应该足以满足您的目的。

【讨论】:

  • 哇!非常感谢@Matt 的详细解释!!对此,我真的非常感激!但是,我无法测试它是否有效,因为在运行我的脚本时出现以下错误消息:使用“1”参数调用“发送”的异常:“发送邮件失败。” (对于 $SmtpClient.Send($MailMessage) 行)。这是什么原因造成的,我该如何解决?
  • 没关系!问题是我将我的 smtp 客户端设置为“SMTP.blah.bleh”,而实际上它只需要“blah.bleh”:)
  • 所以我终于得到了正确发送电子邮件的脚本(耶!!!)。但是参数没有在电子邮件中传递。所以这是电子邮件的正文:=0D=0A以下计数器需要注意:

    ==0D=0AName: $(Arg0)
    =0D=0ADate:
    =0D=0ACounter:
    =0D=0AThreshold:=
    =0D=0A实际值:
    =0D=0A=0D =0A=0D=0A
    ==0D=0A--- 使用SENDMAIL函数自动生成---=0D=0A = =0D=0A 。计数器应该是“% Processor Time”,阈值应该是 10,实际值应该是 50 左右。有什么想法吗?
  • 我发现只有在我开始任务时才会发送电子邮件,而不是在它检测到性能计数器超过限制时发送(这就是为什么电子邮件中没有显示任何值) .最初,我将任务调度程序中的任务设置为“在事件中”触发,日志是系统,源是处理器,当然它不起作用。然后我将 Log 更改为 Application 并将 Source 更改为 PrefCtrs,但仍然只有在我启动任务时才会触发计数器。有什么问题?
  • 我不知道 Log 和 Source 值是否有所不同。我很确定它只是看名字;也许确保您的任务名称与警报的“警报任务”选项卡上指定的值完全匹配,即上面屏幕截图中的“处理器监控”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2021-12-29
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2017-10-26
相关资源
最近更新 更多