Mit PowerShell lassen sich viele Tätigkeiten automatisieren. Praktisch ist es natürlich, wenn das Skript den Erfolg oder Misserfolg bzw. die gewünschten Ergebnisse per Mail versenden kann.
Das ganze ist gar nicht so schwer. Anbei mein Beispielskript mit Erklärungen, das die Festplatten eines Rechners ausliest und die Größe als auch den freien Speicherplatz auflistet.
# Kommentare beginnen mit einem Hashtag!
# E-Mail Server festlegen
$smtpServer = "192.168.1.254" # IP-Adresse des lokalen E-Mail Servers
# $smtpServer = "smtp.gmx.net" # Es geht natürlich auch ein offizieller Anbieter
# Wer versendet die E-Mail?
$emailFrom = "E-Mailadresse@domain.de"
# Wer empfaengt die E-Mail?
$emailTo = "Empfaenger@domain2.de"
# Wir muessen uns am E-Mail Server authentifizieren, also Benutzername
# und Kennwort uebermitteln
# Da wir im Skript keine Kennwoerter im Klartext speichern wollen, lesen
# wir die Daten aus einer Datei ein. Wie die Datei erstellt wird, lest Ihr
# weiter unten
$cred = Import-Clixml cred.clixml
# Den Namen des Computers auslesen
$hostname = hostname
# Betreff der E-Mail festlegen
$subject = "Festplattenstatus von $hostname"
# Bodytext erstellen
$body = "Hallo Empfaenger, `n`n" # `n = naechste Zeile
$body += "anbei der Festplattenstatus von $hostname`n`n"
# Alle lokalen Festplatten auslesen und fuer jedes Objekt den
# Body Text erweitern
gwmi win32_logicaldisk -filter "drivetype=3" | foreach-object {
$size = [double]$_.Size
$size = "{0:N1}" -f ($size/1gb)
$free = [double]$_.FreeSpace
$free = "{0:N1}" -f ($free/1gb)
$name = $_.VolumeName
$id = $_.DeviceID
# Sollte weniger als 10 GB Speicherplatz frei sein, gib eine
# Warnung aus
if ($free -lt 10) {
$body += "!!!WARNUNG!!! - wenig freier Festplattenplatz`n"
}
$body += "Laufwerksbuchstabe: $id `n"
$body += "Laufwerksbezeichnung: $name `n"
$body += "Groesse: $size GB `n"
$body += "Frei: $free GB `n`n"
}
# Bodytext abschliessen
$body += "!!! Automatisierte Email - NICHT antworten !!!"
# Mailobjekt erstellen, Port ggfs. anpassen
$smtp = new-object Net.Mail.SmtpClient($smtpServer,25)
# Wenn SSL benoetigt wird, dann naechste Zeile auskommentieren
# $smtp.EnableSsl = $true
# Zugangsdaten dem Objekt zuweisen
$smtp.Credentials = $cred
# E-Mail versenden
$smtp.Send($emailFrom, $emailTo, $subject, $body)
Benutzername und Kennwort verschlüsselt in eine Datei speichern
Es ist keine gute Idee Kennwörter in Klartext in Skripten zu verwenden. Daher liest das Skript die Zugangsdaten aus einer Datei aus. In meinem Beispiel aus cred.clixml.
Die Datei ist recht einfach zu erstellen und sollte im gleichen Verzeichnis wie das Skript liegen. Ansonsten müsst Ihr den Pfad zu der Datei in Skript ergänzen.
$cred = Get-Credential öffnet ein Popup-Fenster, in dem Ihr die Zugangsdaten für den E-Mailaccount eingebt. Die Daten werden dann in der Variablen $cred gespeichert.
$cred | Export-Clixml cred.clixml exportiert die Zugangsdaten im XML Format in die angegebene Datei cred.clixml. Dabei wird das Kennwort verschlüsselt (Hashwert) und nicht im Klartext gespeichert.
Über Get-Content .\cred.clixml könnt Ihr Euch den Inhalt der erstellten Datei ansehen.
Im Skript wird die Datei über Import-Clixml wieder eingelesen.
PS> $cred = Get-Credential
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
PS> $cred | Export-Clixml cred.clixml
PS> Get-Content .\cred.clixml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0">
<TN RefId="0">
<T>System.Management.Automation.PSCredential</T>
<T>System.Object</T>
</TN>
<ToString>System.Management.Automation.PSCredential</ToString>
<Props>
<S N="UserName">test</S>
<SS N="Password">blablabla-HashwertDesKennwortes-blablabla</SS>
</Props>
</Obj>
</Objs>