Powershell zum Rapport

21. September 2012

Unser Windows-Profi Mark Minasi beschäftigt sich schon eine ganze Weile mit der Powershell. Wie immer bei seinen Tipps und Tricks geht es ihm dabei ganz besonders darum, ein Werkzeug so zu konfigurieren einzusetzen, dass beispielsweise ein Administrator damit seine täglichen Aufgaben leichter und schneller erledigen kann. So zeigt auch hier praxisnah, wie die Powershell eingesetzt werden kann, um einfache Reports zu erstellen. Dazu befasst er sich in diesem Artikel zunächst mit dem Cmdlet send-mailmessage.

Administratoren, die bereits die Powershell-Kommandos rund um Active Directory ausprobiert haben, kennen sicherlich das sehr mächtige Cmdlet search-adacount. Mit seiner Hilfe kann ein Systemverwalter sehr nützliche Informationen aus seiner AD-Datenbank auslesen. Ein Beispiel dafür ist sicher der folgende Gebrauch dieses Cmdlets:

search-adaccount -usersonly -accountinactive -timespan "90"|
select samaccountname,lastlogondate|sort lastlogondate|ft

Dieser – zunächst vielleicht etwas lang erscheinende Aufruf – bringt eine sehr nützliche Liste der Domänen-Anwender auf den Bildschirm, die sich in den letzten 90 Tagen nicht an der Domäne angemeldet haben. Die Ausgabe wird zudem danach sortiert, wie viele Tage seit der jeweils letzten Anmeldung vergangen sind. So ein Kommando kann sicher oft sehr hilfreich sein und ist im Prinzip auch nicht so kryptisch oder komplex, als dass es ein Systemprofi nicht im Kopf behalten könnte.

Aber in der Praxis will eigentlich kaum ein Administrator zu diesem Zweck jedes Mal eine Eingabezeile für die Powershell starten und dieses Kommando eintippen müssen, um an diese Information zu kommen. Aber auch hier kann die Powershell helfen: Mark Minasi zeigt in diesem und dann im nächsten Monat in einem weiteren Artikel, wie es mit Hilfe der Powershell gelingt, einen solchen Report täglich automatisch zu erstellen und es dann per E-Mail an der Administrator zu schicken.

Cmdlet für das Versenden eines Reports: send-mailmessage

Damit dieses Vorhaben aber gelingen kann, bedarf es des Einsatzes eines Cmdlets mit dem Namen send-mailmessage, mit dem die Shell dann den Report verschicken kann. Die grundsätzliche Syntax des Cmdlets ist recht einfach, aber es existieren einige Parameter, deren Einsatz nicht ganz so einleuchtend und simpel ist. In einer einfachen Form sieht ein Aufruf des Cmdlets send-mailmessage folgendermaßen aus:

send-mailmessage -to joe@bigfirm.com -from sue@cogswellcogs.net -cc attorney@win2ktest.com -bcc covermybutt@cogswellcogs.net -subject "Sieht gut aus – das machen wir genauso" -body "Wir treffen uns im Restaurant und unterzeichnen den Vertrag" -smtpserver po.cogswellcogs.net

 Das ist zwar insgesamt eine ziemlich lange Zeile – aber der Aufbau ist dabei doch recht einfach: So sollte es jeder SMTP-Client erlauben, ihm diese Daten zu übergeben.

Die Profile-Datei hilft…

Wer das Cmdlet häufiger einsetzt und nicht jedes Mal den Namen des SMTP-Servers eingeben möchte, kann sich einen Standardnamen für diesen seinen Mail-Server in der Profile-Datei seiner Powershell anlegen. Um das zu tun, muss der Anwender zunächst ein Verzeichnis WindowsPowerShell unter dem Pfad:

Benutzer\<eigener Name\Eigene Dokumente

anlegen, wenn es nicht schon existiert. Dann gilt es dort eine Textdatei mit der Bezeichnung Microsoft.Powershell_profile.ps1 anzulegen. Nach dem Öffnen dieser Datei kann dann dort die folgende Zeile hineingeschrieben werden:

$psemailserver=Name_des_Mailservers

Ein beispielhafter Eintrag könnte dann etwa so aussehen:

$psemailserver=“mail.Firmenname.de“

Wir haben jetzt also zunächst einmal eine Profile-Datei für die eigene Powershell angelegt: Das ist eine einfache Textdatei, in der sich Kommandos befinden, die von der Powershell bei jedem Start ausgeführt werden sollen. Schließlich ist es jetzt noch wichtig, direkt am Prompt der Powershell einmal den folgenden Befehl einzugeben:

set-executionpolicy remotesigned

Durch Eingabe dieses Befehls an der Kommandozeile hat der PC nun die Erlaubnis, Powershell-Scripts auszuführen. Danach können Sie nun die Powershell schließen und wieder starten. Dadurch durchläuft die Shell einmal die neu erstellte Profile-Datei. Danach kann der folgende Befehl direkt an der Kommandozeile der Shell eingegeben werden:

$psemailserver

und die Powershell wird den zuvor zugewiesenen Wert anzeigen. Bevor ein Administrator aber weiter daran geht, ein entsprechendes Powershell-Script zu erstellen, sollte er zunächst einmal das Cmdlet send-mailmessage testen, indem er versucht, eine Testnachricht an einen lokalen Account zu verschicken. Dabei sollen dann eben auch der zuvor gesetzte Namen für die eigenen Mail-Server (kann sich natürlich auch um die IP-Adresse des Servers handeln) zum Einsatz kommen.

Wichtig: Die Sicherheitseinstellungen des eigenen Mail-Servers

Wenn das nicht klappt, so liegt es zumeist daran, wie die Sicherheitseinstellungen des Mail-Servers konfiguriert wurden. Viele Unternehmen konfigurieren ihre internen Mail-Server so, dass Client-Systeme aus dem internen Netzwerk oder solche, die sich über die Domäne authentifiziert haben, problemlos direkt Mail verschicken können.

Wenn der eigene SMTP-Server aber die Angabe von Namen und Passwort verlangt, so kann der Befehl mit dem Zusatz –credential <Nutzername> aufgerufen werden. Das Cmdlet fragt dann nach dem Passwort. Wer aber den Plan hat, diese Reports automatisch zu erstellen, wird die Einstellungen seines SMTP-Servers entsprechend modifizieren müssen, damit ein solches Script dann auch automatisch und ohne Interaktion durch den Anwender ablaufen kann.

Die Syntax des Cmdlets arbeitet wie im Beispiel gezeigt einfach und zuverlässig, obwohl natürlich hier nur eine Nachricht mit einer Zeile mitgegeben wurde. Wie üblich müssen nämlich auch hier alle Werte und Parameter in einer Zeile an die Powershell übergeben werden. Aber es existieren natürlich einige Wege, um mit diesen Einschränkungen umzugehen.

Zunächst einmal können Systemverwalter, die in der Nachricht nur einige kurze Zeilen eingeben wollen, per Hand Zeilenumbrüche mittels des Shell-Escape-Zeichens „`n“ einfügen. Es besteht aus einem „Accent Grave“ und dem kleinen „n“. Ein zweizeiliger Mail-Text könnte dann so eingegeben werden:

… -body „“Treffen gegen Mittag. `n Ich werde warten!“

Diese Nachricht würde dann in der Mail in zwei Zeilen dargestellt werden. Es gibt aber sicher auch die Fälle, in denen der Administrator auf diese Weise nicht einzelne Zeilen, sondern den Inhalt einer Textdatei verschicken möchte. Auch das ist mit Hilfe des Cmdlets get-content recht einfach möglich. So zeigt der folgende Aufruf den Inhalt der Datei Test.txt an:

get-content Test.txt

Viele Anwender werden jetzt vielleicht denken, dass sie diesen Aufruf in Klammern setzen müssen, um ihn in Zusammenhang mit dem send-mailmessage Cmdlet zu verwenden und werden einen Aufruf der folgenden Art einsetzen wollen:

… -body (get-content Test.txt) …

Aber wenn das hier auch aussieht wie Text (oder System.Text in der Terminologie der Powershell) ist nicht wirklich reiner Text: Es handelt sich hier um etwas, was .NET und die Powershell als ein Datentyp der Art System.Object bezeichnen.

Um dieses Problem der korrekten Ausgabe des Textes in den Griff zu bekommen, muss die Ausgabe des get-content Cmdlets in ein anderes Cmdlet per Pipe weitergeleitet werden. Dieses cmdlet trägt die Bezeichnung out-string und wandelt Daten vom Typ System.Object in den Typ System.Text um, so dass die Powershell nun auch korrekt damit arbeiten kann. Der komplette Aufruf besitzt dann die folgende Form:

send-mailmessage -to joe@bigfirm.com -from sally@bigfirm.com -subject "Hier ist der Bericht!"
-body (get-content c:\files\report.txt|out-string)

Wer diese immer noch recht lange Zeile etwas verkürzen möchte, kann das erreichen, indem er einen der Alias-Bezeichnung für get-Content verwendet: cat, type oder auch gc. Handelt es sich bei der Datei mit dem Text um eine HTML-Datei, so kann das send-maimessage Cmdlet durch den Parameter –bodyashtml dazu veranlasst werden, diesen Text auch als HTML zu versenden.

Wir haben in diesem kurzen Artikel gezeigt, wie nützlich das Cmdlet send-mailmessage sein kann und wie flexibel es vom Administrator für die Erstellung von Nachrichten eingesetzt werden kann. Um das Ziel zu erreichen, einen entsprechenden Report automatisch zu versenden, wäre es nun noch sehr nützlich, wenn das send-mailmessage Kommando automatisch ablaufen könnte und dabei den Mail-Text auch ausgeben würde.

Wie diese Vorgaben ebenso einfach zu erfüllen sind, wird Mark Minasi in einem weiteren Artikel hier auf NT4Admins erläutern, den wir im nächsten Monat publizieren werden.

Mark Minasi/ fms

Lesen Sie auch