5

我已經在性能監視器(Windows Server 2008 R2)中創建了一條警報,只要\ Processor(_Total)\%處理器時間高於10(一個小值,以保證始終滿足發送警報的條件)。您可以在圖像中看到警報任務屬性。使用PowerShell腳本從性能監視器發送電子郵件警報

enter image description here

此外,我也創建任務計劃中的新任務將運行用戶是否登錄或沒有,它會使用最高權限運行。此任務的觸發條件有以下特性:

  • 開始新的任務:在事件
  • 設置:基本
  • 日誌:系統
  • 來源:處理器

的操作(這是我不知道它是否正確的部分)具有以下設置:

  • 操作:啓動程序
  • 程序/腳本:PowerShell腳本發送電子郵件的路徑。

PowerShell的代碼如下($名稱,$日期,$計數器,$門檻,$值從何而來性能數據收集器設置警戒任務屬性,如圖片上面):

function SendMail ($name, $date, $counter, $threshold, $value) { 
    $MailMessage = New-Object Net.Mail.MailMessage 
    $MailMessage.To.Add("[email protected]") 
    $MailMessage.From = "[email protected]" 
    $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

您確定所有參數都已在腳本中正確傳遞。另一件事是,如果你使用的是PowerShell v3,那麼你可以使用send-mailmessage cmdlet -http://stackoverflow.com/a/17456077/581922 – Mitul

+0

@Mitul:你的意思是參數$ name,$ date等?如果是這樣,我該如何檢查?如果你指的是電子郵件,SMTP服務器等參數,我使用的是我在Action中使用的相同:發送電子郵件(不同的是,在腳本中,我的smtp服務器以「SMTP」開頭。 (不幸的是,我沒有使用v3: – Anna

+0

您發佈的代碼定義了一個函數,但我沒有看到您在任何地方調用該函數 –

回答

8

基本上有兩件事要解決,應該爲你做這個工作。

  1. 獲取正確傳遞給腳本的警報參數。
  2. 實際上調用腳本中定義的函數。

我們將從參數開始。對警報(見上圖)的警報任務選項卡,編輯任務參數字段並替換:

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

有:

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

你的參數基本上都被解析爲一個空格分隔的字符串值,因此我們在每個單獨的參數標記周圍添加雙引號以處理包含空格的值,並且在每個單獨的參數標記之間添加一個空格,以便我們能夠從下一個參數中指出一個參數。

然後,對於您的計劃任務(名爲「Processor Monitoring」)的操作,您必須告訴它期望來自警報的參數並將這些參數傳遞給PowerShell腳本。

enter image description here

你的行動是正確的,即 「啓動程序」。

對於程序/腳本字段,輸入「powershell.exe」(或瀏覽完整路徑)。

而對於添加參數字段中,輸入:

-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來處理命令行參數,但這應該足以滿足您的需要。

+0

哇!謝謝@Matt非常感謝但是,我無法測試它是否工作,因爲我在運行腳本時遇到以下錯誤消息:使用「1」參數調用「發送」的異常:「發送郵件失敗。「(對於$ SmtpCli行ent.Send(MAILMESSAGE $))。這是什麼原因造成的,我該如何解決? – Anna

+0

沒關係!問題是我把我的smtp客戶端設置爲「SMTP.blah.bleh」,當它實際上只需要「blah.bleh」:) – Anna

+0

所以我終於得到了腳本發送電子郵件正確(YAY !!!) 。但參數不在電子郵件中傳遞。因此,這是電子郵件的正文: = 0D = 0AThe以下計數器需要注意:

== 0D = 0AName:$(爲arg0)
= 0D = 0ADate:
= 0D = 0ACounter:
= 0D = 0AThreshold:=
= 0D = 0AActual值:
= 0D = 0A = 0D = 0A = 0D = 0A
== 0D = 0A ---用SENDMAIL函數自動生成--- = 0D = 0A = = 0D = 0A。計數器應該是「處理器時間百分比」,閾值應該是10,實際值應該在50左右。有什麼想法? – Anna

相關問題