twiedemann
Goto Top

Windows-Event per Powershell als Mail versenden

Hallo zusammen,

ich möchte von einem Windows Server (2016/2019) bzw. Windows 10-Gerät eine E-Mail bekommen, wenn ein Windows-Update erfolgreich installiert wurde.

Meine Idee war das Ganze über Powershell zu lösen, indem die Windows Aufgabenplanung das entsprechende Event überwacht und dann ein Skript auslöst. Mit "wevtutil" sollte das Event ausgelesen werden und mit "mailkit" (Powershell-Modul) erfolgt der Mail-Versand.

Das Skript sieht folgendermaßen aus:

Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.3.5.0\lib\netstandard2.0\MailKit.dll"  
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.3.5.0\lib\netstandard2.0\MimeKit.dll"  
$Eventlog = „System“ # (Security, Application, System)
$EventID = „19“
$SMTP     = New-Object MailKit.Net.Smtp.SmtpClient
$Message  = New-Object MimeKit.MimeMessage
$TextPart = [MimeKit.TextPart]::new("plain")  
$TextPart.Text = (wevtutil qe $Eventlog „/q:*[System [(EventID=$EventID)]]“ /f:text /rd:true /c:1 | Out-String)
$Message.From.Add("absendermail")  
$Message.To.Add("empfängermail")  
$Message.Subject = 'Betreff'  
$Message.Body    = $TextPart
$SMTP.Connect('smtp-server', 587, $False)  
$SMTP.Authenticate('mail-login', 'mailpasswort' )  
$SMTP.Send($Message)
$SMTP.Disconnect($true)
$SMTP.Dispose()

Der Versand funktioniert auch aber leider fehlt die Hälfte der Information.
So müsste es in der Mail aussehen:

Event
Log Name: System
Source: Microsoft-Windows-WindowsUpdateClient
Date: 2023-02-06T10:12:00.6720000Z
Event ID: 19
Task: Windows Update-Agent
Level: Informationen
Opcode: Installation
Keyword: Installation,Erfolgreich
User: S-1-5-18
User Name: NT-AUTORIT─T\SYSTEM
Computer: toni-nb-lenovo
Description:
Installation erfolgreich: Das folgende Update wurde installiert. 9P6CT0SLW589-Microsoft.LanguageExperiencePackde-DE


Und so sieht es aus:

Event
Log Name: System
Source: Microsoft-Windows-WindowsUpdateClient
Date: 2023-02-06T10:12:00.6720000Z
Event ID: 19
Task: Windows Update-Agent
Level: Informationen
Opcode: Installation



Hat jemand eine Idee, woran es liegen könnte? (oder kennt jemand eine Alternative?)
MFG Toni

Content-ID: 5908037425

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

Ausgedruckt am: 23.11.2024 um 16:11 Uhr

spec1re
spec1re 08.02.2023 um 12:18:21 Uhr
Goto Top
Zitat von @twiedemann:
Hat jemand eine Idee, woran es liegen könnte? (oder kennt jemand eine Alternative?)
MFG Toni
Hier funktioniert es ohne extra Module mit Get-WinEvent und Send-MailMessage.

Gruß Spec
twiedemann
twiedemann 08.02.2023 um 13:20:51 Uhr
Goto Top
Zitat von @spec1re:

Zitat von @twiedemann:
Hat jemand eine Idee, woran es liegen könnte? (oder kennt jemand eine Alternative?)
MFG Toni
Hier funktioniert es ohne extra Module mit Get-WinEvent und Send-MailMessage.

Gruß Spec

Leider nein. Send-MailMessage wird von MS nicht mehr empfohlen (und funktioniert auch nicht mit meinem Mail-Provider), man soll MailKit verwenden. Und Get-WinEvent und Get-EventLog verursachen folgenden Mail-Text:

System.Diagnostics.Eventing.Reader.EventLogRecord
3063370895
3063370895 08.02.2023 um 13:22:19 Uhr
Goto Top
Zitat von @twiedemann:
Get-WinEvent und Get-EventLog verursachen folgenden Mail-Text:

System.Diagnostics.Eventing.Reader.EventLogRecord

Das ist dann aber ein Anwenderfehler
twiedemann
twiedemann 08.02.2023 um 13:32:53 Uhr
Goto Top
Interessanterweise bekomme ich den kompletten Log, wenn ich bei wevtutil den Parameter /f:text zu /f:xml ändere. Allerdings kann das in der Mail dann keiner vernünftig lesen 😅
spec1re
spec1re 08.02.2023 um 14:39:29 Uhr
Goto Top
Zitat von @twiedemann:
Leider nein. Send-MailMessage wird von MS nicht mehr empfohlen (und funktioniert auch nicht mit meinem Mail-Provider), man soll MailKit verwenden. Und Get-WinEvent und Get-EventLog verursachen folgenden Mail-Text:

System.Diagnostics.Eventing.Reader.EventLogRecord

Ach was MS empfiehlt 🙄, wenn du eine Exchange/Postfix/SMTP Relay hast ist das immer noch in Ordnung.

Gruß Spec
5175293307
Lösung 5175293307 08.02.2023 aktualisiert um 17:25:54 Uhr
Goto Top
Zitat von @twiedemann:
Und Get-WinEvent und Get-EventLog verursachen folgenden Mail-Text:

System.Diagnostics.Eventing.Reader.EventLogRecord
Nö du musst Objekte halt in Strings umwandeln sonst weiß die Powershell halt nicht wie sie das Objekt als String ausgeben soll und gibt stattdessen den Klassennamen des Objekts aus ...:
$event = Get-WinEvent -LogName System -FilterXPath "*[System[Provider[@Name='Microsoft-Windows-WindowsUpdateClient'] and Task = 1 and (EventID=19)]]" -MaxEvents 1 | %{  
    $xml = [xml]$_.toXML()
    $object = [ordered]@{TimeCreated = $_.TimeCreated}
    'Computer','EventID','Level','EventRecordID'| %{$object.$_ = $xml.Event.System.$_}   
    $xml.Event.EventData.Data.GetEnumerator() | %{$object.($_.Name) = $_.innerText}
    [pscustomobject]$object
} | format-list * | out-string
$event

Btw. würde ich dafür ja gleich nen Tasktrigger verwenden da kann man die Variablen auch direkt übergeben und man muss nicht erneut die Events abfragen ...

Wurstel.