我在性能监视器(Windows Server 2008 R2)中创建了一个警报,应该在\处理器(_Total)\%处理器时间超过10时触发(一个小值只是为了保证发送警报的条件总是满足)。您可以在图像中看到警报任务属性。
此外,我还在Task Scheduler中创建了一个新任务,无论用户是否登录都将运行该任务,并且它将以最高权限运行。此任务的触发器具有以下属性:
动作(这是我不知道它是否正确的部分)具有以下设置:
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)
}
任务启动后,我在历史记录中有以下内容:任务已启动,已启动操作和已创建请求流程。电子邮件从未发送过。
我尝试使用操作发送电子邮件:发送电子邮件,它运行正常。有谁知道什么可能是错的?
答案 0 :(得分:8)
基本上有两件事要解决,应该让这个适合你。
我们将从参数开始。在警报的“警报任务”选项卡上(如上图所示),编辑“任务参数”字段并替换:
{name}{date}{counter}{threshold}{value}
with:
"{name}" "{date}" "{counter}" "{threshold}" "{value}"
您的参数基本上被解析为以空格分隔的字符串值,因此我们在每个参数标记周围添加双引号以处理包含空格的值,并在每个单独的参数标记之间添加一个空格以便我们将能够告诉下一个参数。
然后,对于计划任务的操作(名为“处理器监视”),您必须告诉它预期警报中的参数并将这些参数传递给PowerShell脚本。
您的行动是正确的,即“启动程序”。
对于Program / script字段,输入“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脚本可以使用Alert参数。现在你所要做的就是调用你已定义的函数。将以下内容添加到脚本的末尾(在函数定义之后):
# 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来处理命令行参数,但这应该足以满足您的需要。