5

Ich habe im Systemmonitor (Windows Server 2008 R2) eine Warnung erstellt, die ausgelöst werden sollte, wenn \ Processor (_Total) \% Prozessorzeit über 10 liegt (ein kleiner Wert, nur um zu garantieren dass die Bedingung für das Senden der Warnung immer erfüllt ist). Sie können die Eigenschaften der Alert-Aufgabe im Bild sehen.E-Mail-Benachrichtigung vom Systemmonitor mit PowerShell-Skript senden

enter image description here

Darüber hinaus habe ich auch eine neue Aufgabe in der Aufgabenplanung, die ausgeführt werden soll, ob der Benutzer auf angemeldet ist oder nicht, und es wird mit höchsten Privilegien ausführen. Der Auslöser für diese Aufgabe hat die folgenden Eigenschaften:

  • die Aufgabe, Beginn: Auf einer Veranstaltung
  • Einstellungen: Grund
  • Log: System
  • Quelle: Prozessor

Die Aktionen (und das ist der Teil ich weiß nicht, ob es korrekt ist) hat die folgenden Einstellungen:

  • Aktion: Starten eines Programms
  • Programm/Skript: Der Pfad zu einem PowerShell-Skript zum Senden einer E-Mail.

Der Powershell-Code ist der folgende ($ name, $ date, $ Zähler, $ Schwelle, wird $ Wert kommen, von den Performance Monitor Datensammlern Alarm Task-Eigenschaften, wie im Bild oben gesetzt soll):

Sobald die Aufgabe gestartet wird, habe ich Folgendes in der Historie: Aufgabe gestartet, Aktion gestartet und erstellt fragen Prozess. Die E-Mail wird jedoch niemals gesendet.

Ich habe versucht, eine E-Mail mit der Aktion: Senden Sie eine E-Mail, und es hat gut funktioniert. Weiß jemand, was könnte falsch sein?

+0

Sind Sie sicher, dass alle Parameter korrekt im Skript übergeben werden? Eine andere Sache ist, wenn Sie Powershell v3 verwenden, dann können Sie send-mailmessage Cmdlet -http: //stackoverflow.com/a/17456077/581922 – Mitul

+0

@Mitul: Meinst du die Parameter $ Name, $ Datum, etc? Wenn ja, wie kann ich prüfen? Wenn Sie sich auf den Parameter wie E-Mail, SMTP-Server usw. beziehen, verwende ich das gleiche wie in der Aktion: Eine E-Mail senden (mit dem Unterschied, dass mein SMTP-Server im Skript mit "SMTP" beginnt. (Und leider verwende ich nicht v3 :( – Anna

+0

Der Code, den Sie posteten, definiert eine Funktion, aber ich sehe nicht, dass Sie diese Funktion überall aufrufen. –

Antwort

8

Es gibt im Grunde zwei Dinge zu behandeln, die dies für Sie arbeiten lassen sollten.

  1. Erhalten Sie die Alarmparameter korrekt an Ihr Skript übergeben.
  2. Eigentlich rufen Sie die in Ihrem Skript definierte Funktion auf.

Wir beginnen mit den Parametern. Auf den Alert-Task-Registerkarte für Ihre Warnung vor (oben im Bild), bearbeiten Sie das Task-Feld Argumente und ersetzen:

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

mit:

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

Ihre Parameter grundsätzlich als durch Leerzeichen getrennte Zeichenfolge-Wert analysiert werden Daher fügen wir doppelte Anführungszeichen um jedes einzelne Parameter-Token hinzu, um Werte zu behandeln, die Leerzeichen enthalten, und fügen zwischen jedem einzelnen Parameter-Token ein Leerzeichen ein, so dass wir einen Parameter vom nächsten unterscheiden können.

Anschließend müssen Sie für die geplante Aufgabe ("Processor Monitoring" genannt) festlegen, dass Parameter von der Warnung erwartet werden und diese Parameter an das PowerShell-Skript übergeben werden.

enter image description here

Ihre Aktion ist richtig, das heißt "ein Programm starten".

Geben Sie für das Feld Programm/Skript "powershell.exe" ein (oder suchen Sie nach dem vollständigen Pfad).

Und für das Add Feld Argumente geben Sie dies:

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

Wo perfmon_send_email.ps1 ist die Skript-Datei mit Ihrer Sendmail() Funktion wie oben beschrieben.

Dieses Bit war irgendwie knifflig, also könnte es andere Möglichkeiten geben, dies einzurichten, aber die explizite Verwendung des Parameters -File machte einen Unterschied für meine Tests. Der $(Arg0)-Teil wird mit der Parameterzeichenfolge aus der Warnung ersetzt, wenn der geplante Task PowerShell zum Ausführen des Skripts ausführt.

Das sollte also die Alert-Parameter für Ihr PowerShell-Skript verfügbar machen. Jetzt müssen Sie nur die Funktion aufrufen, die Sie bereits definiert haben. Fügen Sie den folgend bis zum Ende des Skripts (nach der Definition der Funktion):

# Get parameter values by position and pass them to the SendMail() function. 
SendMail $args[0] $args[1] $args[2] $args[3] $args[4] 

$args ist ein Array mit den Parameterwerten in einer Skriptdatei von der Kommandozeile aufgerufen geben, das ist genau das, was wir die geplante konfigurierten Aufgabe zu tun.

Da wir wissen, dass die Warnung immer die gleichen Werte in der gleichen Reihenfolge senden wird, dh Name, Datum, Zähler, Schwellenwert und Wert, können wir sie einfach aus den Befehlszeilenargumenten basierend auf Position holen und an die übergeben SendMail() -Funktion.

Beachten Sie, dass more robust ways Befehlszeilenargumente verarbeiten, aber dies sollte für Ihre Zwecke ausreichen.

+0

Wow! Danke @Matt so viel für die detaillierte Erklärung !! Ich schätze es wirklich! Ich kann jedoch nicht testen, ob es funktioniert, weil ich die folgende Fehlermeldung bei der Ausführung meines Skripts habe: Ausnahme beim Aufruf von "Senden" mit "1" Argument: "Fehler beim Senden von Mail . "(für die Zeile $ SmtpCli ent.Send ($ MailMessage)). Was verursacht das und wie behebe ich es? – Anna

+0

Macht nichts! Das Problem war, dass ich meinen SMTP-Client auf "SMTP.blah.bleh" setze, wenn es eigentlich nur "blah.bleh" sein muss :) – Anna

+0

Also habe ich endlich das Skript, um E-Mails richtig zu versenden (YAY !!!) . Aber die Parameter werden nicht in der E-Mail übergeben.Das ist also der Körper der E-Mail: = 0D = 0aDer folgender Zähler braucht Aufmerksamkeit:

== 0D = 0AName: $ (arg0)
= 0D = 0ADate:
= 0D = 0ACounter:
= 0D = 0AThreshold: =
= 0D = 0AActual Wert:
= 0D = 0A = 0D = 0A = 0D = 0A
== 0D = 0A --- automatisch Sendmail-Funktion erzeugt --- = 0D = 0A = = 0D = 0A. Der Zähler sollte "Prozessorzeit%" sein, der Schwellenwert sollte 10 sein und der tatsächliche Wert sollte bei 50 liegen. Irgendwelche Gedanken? – Anna