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)
}

タスクが開始されると、履歴に次のように表示されます: タスクの開始、アクションの開始、および作成された ask プロセス。ただし、メールは送信されません。

Action: Send an email を使用してメールを送信しようとしましたが、うまくいきました。誰が何が間違っているのか知っていますか?

4

1 に答える 1

8

基本的に、これを機能させるために対処すべきことが 2 つあります。

  1. スクリプトに正しく渡されたアラート パラメータを取得します。
  2. スクリプトで定義された関数を実際に呼び出します。

パラメータから始めます。アラートの [アラート タスク] タブ (上図) で、[タスクの引数] フィールドを編集し、次のように置き換えます。

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

と:

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

パラメーターは基本的にスペースで区切られた文字列値として解析されるため、個々のパラメーター トークンを二重引用符で囲んでスペースを含む値を処理し、個々のパラメーター トークンの間にスペースを追加して、次のことができるようにします。次のパラメーターから 1 つのパラメーターを伝えます。

次に、スケジュールされたタスク (「プロセッサの監視」という名前) のアクションのために、アラートからのパラメーターを期待し、それらのパラメーターを PowerShell スクリプトに渡すように指示する必要があります。

ここに画像の説明を入力

あなたのアクションは正しいです。つまり、「プログラムを開始する」です。

[プログラム/スクリプト] フィールドに、「powershell.exe」と入力します (またはフル パスを参照します)。

[引数の追加] フィールドには、次のように入力します。

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

perfmon_send_email.ps1上記の SendMail() 関数を含むスクリプト ファイルは どこにありますか。

このビットはちょっと厄介だったので、これを設定する他の方法があるかもしれませんが、-Fileパラメーターを明示的に使用すると、私のテストに違いが生じました. この$(Arg0)部分は、スケジュールされたタスクが PowerShell を実行してスクリプトを実行するときに、アラートのパラメーター文字列に置き換えられるものです。

これで、アラート パラメーターを 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 に答える