Mein Blog wird auf einem Windows 2003 Server gehostet. Da ich gerne wissen möchte, was dort so alles passiert, habe ich mir ein kleines Powershell-Script geschrieben, welches mir einmal pro Tag die Eventlog-Einträge des letzten Tages per E-Mail zusendet:
$sys = Get-Eventlog -list | Foreach-Object -process{Get-Eventlog $_.Log} | ?{$_.TimeGenerated -gt [DateTime]::Now.AddDays(-1)} | ConvertTo-Html
$msg = New-Object Net.Mail.MailMessage("from@my.mail", "to@my.mail", "Daily Eventlog summary", $sys)
$msg.IsBodyHTML = $true
$smtp = New-Object NetMail.SmtpClient("mailserver.my.mail")
$smtp.Send($msg)
Was macht das Script genau?
Zuerst wird per
Get-Eventlog -list eine Liste der auf dem System vorhandenen Eventlogs erstellt. Das Ergebnis wird an das Foreach-Object-Cmdlet gepipt, welches für jedes Element der Liste die Einträge abfragt:
Foreach-Object -process{Get-Eventlog $_.Log}
Die daraus resultierende Liste von Einträgen wird dann gefilter. Es sollen nur die Einträge weiterverarbeitet werden, die innerhalb des letzten Tages erstellt wurden:
?{$_.TimeGenerated -gt [DateTime]::Now.AddDays(-1)} Diese Zeile kann auch als
Where-Object {$_.TimeGenerated -gt [DateTime]::Now.AddDays(-1)}geschrieben werden, aber ? ist einfach etwas schneller.
Die gefilterten Einträge werden dann als HTML
ConvertTo-HTMLin der Variablen
$sys gespeichert.
Im nächsten Schritt wird ein
System.Net.Mail.MailMessage-Objekt erstellt, welches die HTML-Liste
$sys der Eventlog-Einträge als Nachrichtentext übergeben bekommt.
$msg = New-Object Net.Mail.MailMessage("from@my.mail", "to@my.mail", "Daily Eventlog summary", $sys)Die MailMessage-Instanz ist nötig, da wir eine HTML-Mail versenden wollen.
$msg.IsBodyHTML = $trueMöchten wir PlanText versenden, können wir den Nachrichtentext auch der
$smtp.Send()-Methode übergeben.
Um die Mail per smtp.Send versenden zu können, muss erst der
SmtpClient instanziiert werden. Im Konstruktor bekommt er den Mailserver übergeben, über der die Nachricht gesendet werden soll.
$smtp = New-Object NetMail.SmtpClient("mailserver.my.mail")
$smtp.Send($msg)Im nächsten Schritt werde ich daraus ein kleines, konfigurierbares C#-Programm erstellen, das zum Beispiel verschiedene Ereignisquellen ausfiltern kann.