Windows Ereignisanzeige E-Mail senden
Hallo Admins,
für Dies und Das lasse ich mir über die Windows Ereignisanzeige E-Mails schicken, wenn es nicht über ein Monitoring geht.
ID raussuchen > Aufgabe erstellen > Powershell-Script wird ausgeführt welches eine E-Mail mit statischem Inhalt versendet.
Frage
Wie packe ich den Inhalt eines Ereignisses mit in eine E-Mail, am besten mit Bordmitteln?
Besten Dank für konstruktive Hilfe.
für Dies und Das lasse ich mir über die Windows Ereignisanzeige E-Mails schicken, wenn es nicht über ein Monitoring geht.
ID raussuchen > Aufgabe erstellen > Powershell-Script wird ausgeführt welches eine E-Mail mit statischem Inhalt versendet.
Frage
Wie packe ich den Inhalt eines Ereignisses mit in eine E-Mail, am besten mit Bordmitteln?
Besten Dank für konstruktive Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 13086702909
Url: https://administrator.de/contentid/13086702909
Ausgedruckt am: 03.12.2024 um 17:12 Uhr
17 Kommentare
Neuester Kommentar
Hallo,
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
So z.B.? Ergebnisse kommen ja als Objekt zurück. Dann einfach den Body mit leben füllen.....
Musst nur Body und Subject mit Leben füllen. Ein Format das sauber rüber kommt. Kann auch HTML sein. Oder Plaintext.
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
So z.B.? Ergebnisse kommen ja als Objekt zurück. Dann einfach den Body mit leben füllen.....
$MailEmpfaenger = "name@domain.net"
[string]$MailSmtpServer = "exchange.domain.net"
[int]$MailSmtpPort = 25
$msg = new-object Net.Mail.MailMessage
#Change port number for SSL to 587
$smtp = New-Object Net.Mail.SmtpClient($MailSmtpServer, $MailSmtpPort)
#$smtp.Credentials = New-Object System.Net.NetworkCredential( $username, $password )
#From Addresss
$msg.From = "svc_ereignisservice@domain.net"
#To Address, Copy the below line for multiple recipients
$msg.To.Add($MailEmpfaenger)
$msg.body =
#Message Subject
$msg.Subject =
$msg.IsBodyHtml = $true
$smtp.Send($msg)
Musst nur Body und Subject mit Leben füllen. Ein Format das sauber rüber kommt. Kann auch HTML sein. Oder Plaintext.
Moin.
Als Beispiel ein Powershellskript-Alert für einen Plattenausfall im Storagespace, welcher vom Taskscheduler durch das selbe Event getriggert wird
Als Beispiel ein Powershellskript-Alert für einen Plattenausfall im Storagespace, welcher vom Taskscheduler durch das selbe Event getriggert wird
$Date = (Get-Date).AddMinutes(-1)
$Event = (Get-WinEvent -FilterHashtable @{LogName="Microsoft-Windows-StorageSpaces-Driver/Operational"; Starttime=$Date; Id='205'} -maxevents 1)
Send-MailMessage -From 'hans@wurst.de' -To "logging@wurst.de" -priority High -Subject "StorageSpace-Festplatte auf Wurstserver evtl. ausgefallen!" -SmtpServer Deinmaliserver -Body $Event.message
Servus.
Bei einem Task-Trigger kannst du im Task über
Habe ich hier schon mehrfach beschrieben wie dies geht
Grüße Uwe
Bei einem Task-Trigger kannst du im Task über
<ValueQueries>
Variablen definieren die per XPATH die Daten gezielt aus dem Event extrahieren und welche du dann an dein Skript schön als Parameter mittels $(VariablenName)
übergeben kannst, dann erübrigt sich eine nachträgliche Abfrage per Get-Eventlog oder Get-WinEvent.Habe ich hier schon mehrfach beschrieben wie dies geht
- ActiveDirectory Benachrichtigung
- Wie kann ich per Aufgabenplanung einen Wert an ein Script übergeben
- Bei Event funktioniert das Powershell Script nicht richtig
Grüße Uwe
Naja du kansnt auch direkt eine Aufgabe an das Ereignis hängen. Steht in der Anzeige rechts im Menü. Oder rechte Maustaste.
E-Mail (veraltet) ist auch noch als Option da. ID oder Meldungen wie 0 für OK, 2 für Error sind aus dem selektieren Ergebnis dann schon voreingestellt.
Ist eine ähnliche Maske wie wen man den Trigger von Hand einstellt. Nur dort ist er dann schon gefüllt.
E-Mail (veraltet) ist auch noch als Option da. ID oder Meldungen wie 0 für OK, 2 für Error sind aus dem selektieren Ergebnis dann schon voreingestellt.
Ist eine ähnliche Maske wie wen man den Trigger von Hand einstellt. Nur dort ist er dann schon gefüllt.
Nein. Task als XML exportieren, bearbeiten wie in den o.g. Beiträgen beschrieben und wieder importieren.
Steht eigentlich oben bereits verlinkt Schritt für Schritt wenn man diese denn mal lesen würde ☹️.
Steht eigentlich oben bereits verlinkt Schritt für Schritt wenn man diese denn mal lesen würde ☹️.
Zitat von @nachgefragt:
den Link hatte ich kurz geöffnet, dann stand da was von 2012 bzw. 2013 und der Bildschirm ging aus
Na und? Nur weil ein Beitrag etwas älter ist heißt das nicht automatisch das er obsolet ist. Seit dem hat sich am Taskplaner so gut wie nichts großartig geändert was die grundlegenden Dinge betrifft.den Link hatte ich kurz geöffnet, dann stand da was von 2012 bzw. 2013 und der Bildschirm ging aus
Obwohl ich aber auch der Meinung bin das der mal gehöriger Renovierung bedarf. Aber darauf kann man wohl bis auf den Sankt Nimmerleinstag warten, MS entwickelt lieber neue hippe KI-Features statt bewährtes zu pflegen und zu verbessern.
Gibt es keine Methode außer dem Export und Import der XML?
Das ist die GUI Methode du kannst das natürlich auch per Powershell ex- und wieder importieren wenn du das lieber magst.https://learn.microsoft.com/en-us/powershell/module/scheduledtasks/expor ...
https://learn.microsoft.com/en-us/powershell/module/scheduledtasks/regis ...
Es sieht im o.g. Screenshot so als als biete Windows (seit damals?) nun ein extra Setup dafür, einen eigenen Filter dafür zu erstellen.
Die Filter kannst du ja seit jeher im Task selbst über manuelle Bearbeitung per XPath erledigen, das hattest du aber nicht gefragt, meine Anleitung zielt nicht auf die Filterung von Events ab sondern die Übertragung der einzelnen Event-Eigenschaften an das Skript! Und die musst du nunmal manuell in der Taskdefinition hinzufügen und dem Skript in den Argumenten mitgeben damit sie dort verfügbar sind. Du missinterpretierst da offensichtlich etwas.Das war ja auch nur eine Möglichkeit. So wie DWW es mit der nachträglichen Abfrage per Get-WinEvent beschreibt kannst du es natürlich auch machen, jeder wie er mag und es braucht.
Danke für den Kaffee aber den hätte es eigentlich nicht gebraucht.
Naja dann müssen wir halt mal wieder zu Fuß gehen .
Die Queries müssen manuell unter dem Knoten EventTrigger eingefügt werden da sie Standardmäßig noch nicht vorhanden sind
Beispiel-Queries
An die Eigenschaften für die Abfragen kommst du wenn du die Details eines der Events öffnest unter Details
In diesem Fall sieht eine Query für die Abfrage der Eigenschaft Username in dem Beispiel so aus:
Man muss also vom Root ausgehend bis zum gewünschten Element den Tree definieren. wie die Abfragesprache XPath grundsätzlich funktioniert kannst du hier nachlesen https://www.w3schools.com/xml/xpath_intro.asp
Damit wir die Eigenschaften des Events in unserem Skript verwenden können müssen wir sie in den Argumenten der Task-Aktion übergeben, dabei werden die Variablen mit $(variablenname) angegeben.
Für mein Test-Skript sieht das dann so aus
Nun noch dem Powershell Skript mit param() die übergebenen Parameter bekannt machen:
Noch als Ergänzung zu den XPath Abfragen.
Dort stößt du häufig auf Pfade die sich nur durch ein XML-Attribut unterscheiden, wie bspw. sowas hier:
In dem Fall würde, um die Daten der Eigenschaft KeysUpdated zu erhalten, die Query so aussehen:
Damit sollte das Prozedere nun eigentlich auch dir klar sein.
Viel Erfolg!
Grüße Uwe
eine Verlinkung irgendwo irgendwelche Paramater zu ziehen gibt es nicht.
Doch unter Details im XML Abschnitt ganz unten .Naja dann müssen wir halt mal wieder zu Fuß gehen .
Taskplaner: Event-Eigenschaften eines Tasktriggers an ein Powershell-Skript übergeben
1. Neuen Tasktrigger anlegen und diesen exportieren
2. XML Datei des Tasks öffnen und XPath-Queries für die Event-Eigenschaften eintragen
Die Queries müssen manuell unter dem Knoten EventTrigger eingefügt werden da sie Standardmäßig noch nicht vorhanden sind
Beispiel-Queries
<ValueQueries>
<Value name="ipaddress">Event/UserData/EventXML/Param3</Value>
<Value name="username">Event/UserData/EventXML/Param1</Value>
</ValueQueries>
An die Eigenschaften für die Abfragen kommst du wenn du die Details eines der Events öffnest unter Details
In diesem Fall sieht eine Query für die Abfrage der Eigenschaft Username in dem Beispiel so aus:
Event/UserData/EventXML/Param1
Man muss also vom Root ausgehend bis zum gewünschten Element den Tree definieren. wie die Abfragesprache XPath grundsätzlich funktioniert kannst du hier nachlesen https://www.w3schools.com/xml/xpath_intro.asp
3. XML-Datei wieder speichern (Wichtig: Dabei darauf achten das im UTF-16 Encoding abgespeichert wird!)
4. Alten Task löschen (sonst ist er ja doppelt).
5. Angepassten Task wieder importieren
6. Skript-Argumente im Task anpassen
Damit wir die Eigenschaften des Events in unserem Skript verwenden können müssen wir sie in den Argumenten der Task-Aktion übergeben, dabei werden die Variablen mit $(variablenname) angegeben.
Für mein Test-Skript sieht das dann so aus
-EP Bypass -File "C:\script.ps1" -username "$(username)" -ipaddress "$(ipaddress)"
6. Powershell-Skript so anpassen damit es die Parameter akzeptiert
Nun noch dem Powershell Skript mit param() die übergebenen Parameter bekannt machen:
7. Ergebnis des Test-Skriptes
Hier noch mein Test-Task (Trigger ist hier eine Anmeldung über RDP)
(Bitte daran denken: Muss im UTF-16 Encoding abgespeichert werden!)<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><QueryList><Query Id="0" Path="Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational"><Select Path="Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational">*[System[EventID=1149]]</Select></Query></QueryList></Subscription>
<ValueQueries>
<Value name="ipaddress">Event/UserData/EventXML/Param3</Value>
<Value name="username">Event/UserData/EventXML/Param1</Value>
</ValueQueries>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<LogonType>InteractiveToken</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>powershell</Command>
<Arguments>-EP Bypass -File "C:\script.ps1" -username "$(username)" -ipaddress "$(ipaddress)"</Arguments>
</Exec>
</Actions>
</Task>
Und das Powershell Skript
param(
[string]$username,
[string]$ipaddress
)
write-host "Username: $username"
Write-Host "IP-Address: $ipaddress"
Read-Host
Noch als Ergänzung zu den XPath Abfragen.
Dort stößt du häufig auf Pfade die sich nur durch ein XML-Attribut unterscheiden, wie bspw. sowas hier:
In dem Fall würde, um die Daten der Eigenschaft KeysUpdated zu erhalten, die Query so aussehen:
Event/EventData/Data[@Name='KeysUpdated']
Damit sollte das Prozedere nun eigentlich auch dir klar sein.
Viel Erfolg!
Grüße Uwe