5

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

在此处输入图像描述

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

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

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

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

任务启动后,我在历史记录中会显示以下内容:任务已启动、操作已启动和已创建询问流程。电子邮件永远不会发送。

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

4

1 回答 1

8

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

  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() 函数.

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

于 2013-08-28T23:19:24.817 回答