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-Key: 5908037425

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

Printed on: May 4, 2024 at 09:05 o'clock

Member: spec1re
spec1re Feb 08, 2023 at 11:18:21 (UTC)
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
Member: twiedemann
twiedemann Feb 08, 2023 at 12:20:51 (UTC)
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
Mitglied: 3063370895
3063370895 Feb 08, 2023 at 12:22:19 (UTC)
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
Member: twiedemann
twiedemann Feb 08, 2023 at 12:32:53 (UTC)
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 😅
Member: spec1re
spec1re Feb 08, 2023 at 13:39:29 (UTC)
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
Mitglied: 5175293307
Solution 5175293307 Feb 08, 2023 updated at 16:25:54 (UTC)
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.