nachgefragt
Goto Top

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.

Content-ID: 13086702909

Url: https://administrator.de/contentid/13086702909

Ausgedruckt am: 03.12.2024 um 17:12 Uhr

Crusher79
Crusher79 30.01.2024 um 12:07:33 Uhr
Goto Top
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.....

$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.
DerWoWusste
DerWoWusste 30.01.2024 aktualisiert um 12:10:49 Uhr
Goto Top
Moin.

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  
colinardo
colinardo 30.01.2024 aktualisiert um 12:25:35 Uhr
Goto Top
Servus.
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

Grüße Uwe
Xmastree
Xmastree 30.01.2024 um 12:19:15 Uhr
Goto Top
Hallo! Ich verwende dazu das kostenlose Tool Swithmail. Das funktioniert auch, wenn der Mailserver down wäre. Habe damit sehr gute Erfahrungen gemacht. Am besten verwendet man ein SMTP-Konto ausserhalb des Mailservers.

Grüße
Crusher79
Crusher79 30.01.2024 um 12:42:31 Uhr
Goto Top
Blöde Frage: Nimmst es für Kunden die kein Monitoring haben, oder als Ersatz für fehlendes Modul?

Zabbix u.ä. kann man selber einfach erweitern. Auch mit PowerShell z.B. Veeam Backups abfragen. Hast du hier nun gar kein Monitoring, oder bekommst du es nur nicht hinein?
nachgefragt
nachgefragt 30.01.2024 um 15:03:41 Uhr
Goto Top
Zitat von @colinardo:
Bei einem Task-Trigger kannst du im Task über <ValueQueries> Variablen definieren die per XPATH die Daten gezielt aus dem Event extrahieren
Danke soweit,
na mal schauen ob wir es hinbekommen. Bin ich hier richtig und wenn ja, was muss man da eingeben? Das ist nicht mein Fachgebiet, daher vielen Dank für konstruktive Hilfe!
1
Crusher79
Crusher79 30.01.2024 um 15:28:23 Uhr
Goto Top
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.
30-01-_2024_15-28-51
colinardo
colinardo 30.01.2024 aktualisiert um 15:43:19 Uhr
Goto Top
Zitat von @nachgefragt:
Bin ich hier richtig und wenn ja, was muss man da eingeben?
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 ☹️.
nachgefragt
nachgefragt 31.01.2024 um 07:12:39 Uhr
Goto Top
Zitat von @colinardo:
Steht eigentlich oben bereits verlinkt Schritt für Schritt wenn man diese denn mal lesen würde ☹️.
Danke,
den Link hatte ich kurz geöffnet, dann stand da was von 2012 bzw. 2013 und der Bildschirm ging aus face-wink

Gibt es keine Methode außer dem Export und Import der XML? 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.
colinardo
colinardo 31.01.2024 aktualisiert um 08:05:49 Uhr
Goto Top
Zitat von @nachgefragt:
den Link hatte ich kurz geöffnet, dann stand da was von 2012 bzw. 2013 und der Bildschirm ging aus face-wink
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.

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.
nachgefragt
nachgefragt 31.01.2024 aktualisiert um 11:22:29 Uhr
Goto Top
Zitat von @colinardo:
Du missinterpretierst da offensichtlich etwas.
Erstmal spendiere ich dir einen Kaffee.

Ich habe schlichtweg keine Ahnung und bin fein damit nicht alles wissen zu können, ist auch einfach nicht mein täglich Brot. Daher ist es leider nicht hilfreich, wir reden offensichtlich aneinander vorbei.

Versuch #2
Was muss man machen damit man den Inhalt des Feldes "Allgemein" per E-Mail gesendet bekommt?
Falls jemand eine silbertablett fertige Lösung hat, besten Dank dafür!
unbenannt

Bisher löst das Ereignis nur eine Aufgabe aus, welches ein starres Powershell startet, in dem ein fixer Text gesendet wird, eine Verlinkung irgendwo irgendwelche Paramater zu ziehen gibt es nicht.
colinardo
Lösung colinardo 31.01.2024 aktualisiert um 14:46:47 Uhr
Goto Top
Danke für den Kaffee aber den hätte es eigentlich nicht gebraucht.

eine Verlinkung irgendwo irgendwelche Paramater zu ziehen gibt es nicht.
Doch unter Details im XML Abschnitt ganz unten face-smile.

Naja dann müssen wir halt mal wieder zu Fuß gehen face-wink.

back-to-topTaskplaner: Event-Eigenschaften eines Tasktriggers an ein Powershell-Skript übergeben


back-to-top1. Neuen Tasktrigger anlegen und diesen exportieren


screenshot

back-to-top2. 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>

screenshot2

An die Eigenschaften für die Abfragen kommst du wenn du die Details eines der Events öffnest unter Details

screenshot

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

back-to-top3. XML-Datei wieder speichern (Wichtig: Dabei darauf achten das im UTF-16 Encoding abgespeichert wird!)


back-to-top4. Alten Task löschen (sonst ist er ja doppelt).


back-to-top5. Angepassten Task wieder importieren


screenshot

back-to-top6. 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)"  

back-to-top6. Powershell-Skript so anpassen damit es die Parameter akzeptiert


Nun noch dem Powershell Skript mit param() die übergebenen Parameter bekannt machen:

screenshot


back-to-top7. Ergebnis des Test-Skriptes


screenshot

back-to-topHier 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>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational"&gt;&lt;Select Path="Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational"&gt;*[System[EventID=1149]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</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>

back-to-topUnd 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:

screenshot3

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
DerWoWusste
DerWoWusste 31.01.2024 um 15:23:32 Uhr
Goto Top
...und sollte es nicht klar sein, nimm meinen Weg. Er braucht zwar 3 Watt mehr im Jahr, aber er ist evtl. schneller zu erlernen.
nachgefragt
nachgefragt 02.02.2024 aktualisiert um 10:24:43 Uhr
Goto Top
Zitat von @colinardo:
Damit sollte das Prozedere nun eigentlich auch dir klar sein.
Danke, ich sehe den Aufwand und weiß es zu schätzen.
Gute Anleitungen zu schreiben ist schwer, "sollte nun eigentlich auch dir klar sein" - touchee?

z.B.
In dem roten Kasten schreibst du "Name der Variable..." und verweist auf "ipadress".
Auch interessant wo nun auf einmal "username" herkommt.

Fazit
Die Variante funktioniert für mich nicht, belassen wir es einfach dabei. Vielleicht hilft es aber anderen.
Dennoch vielen Dank für die Mühe!
nachgefragt
nachgefragt 02.02.2024 aktualisiert um 10:25:32 Uhr
Goto Top
Zitat von @DerWoWusste:
...und sollte es nicht klar sein, nimm meinen Weg. Er braucht zwar 3 Watt mehr im Jahr, aber er ist evtl. schneller zu erlernen.
Danke, aber das koppelt nur den Trigger der Aufgabe mit der Script, soweit war ich schon.

Ich brauch noch den Teil vom Ereignis der in C:\Windows\System32\winevt\Logs\Application.evtx steht, Feld Allgemein, also warum das Ereignis ausgelöst wurde. Da ist eben genau das drin was ich sonst manuell nachschauen müsste. Ganz einfallslos könnte ich immer die Datei mitschicken, was aber nicht wirklich schön ist.
DerWoWusste
DerWoWusste 02.02.2024 um 10:53:09 Uhr
Goto Top
Danke, aber das koppelt nur den Trigger der Aufgabe mit der Script, soweit war ich schon.
Du irrst. Damit bekomme ich die Message aus dem Feld "Allgemein"´zugeschickt.
nachgefragt
nachgefragt 06.02.2024 um 13:19:50 Uhr
Goto Top
Zitat von @DerWoWusste:
Du irrst. Damit bekomme ich die Message aus dem Feld "Allgemein"´zugeschickt.
Ok danke, ich teste es bei Gelegenheit.