PowerShell – 08 – Ein Schedule Task anlegen

Es ist wesentlich unkomplizierter einen Schedule Task für PowerShell Scripte einzurichten als für ein VB Script. (vgl. zu meinem Beitrag Ad-hoc Netzwerk unter Windows 8 erstellen, Netzwerk automatisch starten). In die Computerverwaltung (compmgmt.msc) unter Systemsteuerung\Verwaltung\Computerverwaltung gibt es den Punkt Aufgabenplanung (Schedule Task). Dort mit einem Rechtsklick auf „Aufgabe erstellen“ klicken, nicht auf „einfache Aufgabe erstellen…“, hier wird lediglich ein Assistent ausgeführt.

00 Schedule Task PS

Der neuen Aufgabe muss ein Name gegeben werden. Eine Beschreibung ist hingebend nicht notwendig.

01 Task Schedule PS

Werden administrative Rechte zum ausführen eines Scriptes benötigt, sollte der auszuführende Benutzer entsprechende Reche haben. Wenn das Script für mehrere Benutzer laufen soll, empfehle ich ein eigens dafür erstelltes Systemkonto zu verwenden. Dieses Systemkonto sollte nur eine Aufgabe haben, Schedule Tasks auszuführen mit entsprechender Berechtigung. Das Systemkonto heißt in meinem Beispiel Administrator. Dies ist ein denkbar unglücklich gewählter Name. Zu beachten gilt, wenn ein anderes Konto zur Ausführung genutzt wird, muss die Option „unabhängig von der Benutzeranmeldung ausführen“ angewählt werden. Das Kennwort sollte dabei ebenfalls gespeichert werden. Lässt sich das Script danach nicht ausführen, kann dies an der Serverhärtung liegen und es muss ein Haken bei „Mit höchsten Privilegien ausführen“ gesetzt werden.

02 Schedule Task PS

Sollte eine Hinweisfenster erscheinen, was besagt, dass der User Account Rechte zum ausführen von Batch Jobs benötigt, so ist der angegebene User Account nicht in der Gruppe der lokalen Administratoren und hat somit auch keine Rechte Scripte auszuführen. Leider hatte ich jetzt nur einen englisch sprachigen Screenshot zur Hand.

02.1 Schedule Task PS

Es muss mindestens ein Trigger, also ein Ereignis gewählt werden, wann das Script ausgeführt werden soll. Dies kann eine bestimmte Uhrzeit zu einem bestimmten Datum sein oder das Ereignis kann sich auch zu bestimmten Intervallen wiederholen.

03 Schedule Task PS

In meinem Beispiel habe ich einfach „beim Starten“, „beim Anmelden“ und „beim Aufheben der Arbeitsstationssperre“ ausgewählt, sodass das Script beim Anmelden, nach dem Starten und laden der Benutzeroberfläche und dem Reaktivieren des Arbeitsplatzes eines Benutzer ausgeführt werden.

04 Schedule Task PS

Unter Aktion wird nun das Script angegeben. Als Aktion wird „Programm starten“ ausgewählt und in die TextBox Programm/Script wird der Pfad zur PowerShell.exe angegeben.Dieser ist standartmäßig C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe. Als Argument wird nun der Pfad des auszuführenden Scriptes angegeben. Unter „Starten in“ muss nichts eingetragen werden.

05 Schedule Task PS

Das Ergebnis sieht dann wie folgt aus.

06 Task Schedule PS

Anstatt ein Programm auszuwählen, kann auch eine E-Mail verstand oder eine Meldung (Messagebox) ausgegeben werden. Natürlich ließe sich auch eine E-Mail mittels PowerShell-Script verschicken, vlg. zu meinem Beitrag PowerShell – 07 – E-Mail versenden mit/ohne Dateianhang, Authentifizierung.

07 Task Schedule PS

In den Registern Bedingungen und Einstellungen müssen i.d.R. keine Änderungen vorgenommen werden, so auch in meinem Beispiel. Anschließend muss bei der Bestätigung des Schedule Task das Passwort des Systemkontos (hier Administrator) eingeben werden.

08 Schedule Task PS

Der Task Schedule ist nun eingerichtet und greift bei der nächsten Anmeldung bzw. Reaktivierung des Arbeitsplatzes.

rewe

PowerShell – 07.1 – Get-Credential

Die cmdlet Get-Credential eignet sich hervorragend um eine Benutzerauthentifizierung durchzuführen. Das eingegebene Passwort wird als Secure String hinterlegt und kann somit nicht ohne Weiteres als Klartext ausgeben werden. Versucht man das Passwort als String auszugeben wird lediglich „System.Security.SecureString“ angezeigt.  Um Benutzername und Passwort in einem Script verwenden zu können muss der Input natürlich in eine Variable gespeichert werden. Dies geschieht hier mit $MyCredential. Über $MyCredential.UserName lässt sich der Benutzername ausgeben. Das eingegebene Passwort hingegen nicht.

Natürlich kann das Passwort auch mittels einer cmdlet wieder entschlüsselt werden. Dies ist allerdings nur in beschränkten Maße möglich. Bei der Verschlüsselung des SecureString wird die SID des Benutzers und des Computers verwendet. So ist es nur dem Benutzer möglich den SecureString wieder zu entschlüsseln, der ihn verschlüsselt hat und das nur auf  dem selben Computer wo er den Verschlüsselung vorgenommen hat. Ändert sich die SID des Benutzers oder des Computers ist die Datei Müll. Die Console wirft dann Fehler wie „Schlüssel ist im angegebenen Status nicht möglich“.

So sieht die Eingabebox der cmdlet aus. Diese lässt sich noch einwenig anpassen.

00 get-credential

In dem Hinweistext können auch Variablen verarbeitet werden. In diesem Beispiel sind keine Variablen verwendet worden. Dennoch wäre es möglich vorher ermittelte Daten wie z.B. der letzte Logon des Users, etc. zu implementieren.

01 get-credential

Vordefinierte Benutzernamen sind ebenfalls möglich.

02 get-credential

Hier ein Beispiel um eine Passwortabfrage zu prüfen. Der große Nachteil dieses Script ist, das das Passwort in Klartext hinterlegt werden muss. Doch Für dieses Problem gibt es auch eine Lösung. Dazu mehr in einem nächsten Artikel.  Ich werde beschreiben wie sich Passwörter sicher in Textfiles scheiben lassen und wie man diese für spätere Zwecke wieder nutzen kann.

 So viel zu den Grundlagen zu Get-Credential.

rewe

PowerShell – 07 – E-Mail versenden mit/ohne Dateianhang, Authentifizierung

Es gibt die verschiedensten Wege um E-Mails über PowerShell zu versenden. Eine Variante ist, man baut sich die E-Mail samt benötigten Informationen selbst zusammen oder man nutzt die cmdlet Send-MailMessage. Die cmdlet gibt es seit PowerShell 2.0. Die Vorteile liegen auf der Hand, alle benötigten Informationen, wie SMTP-Server, E-Mail-Adresse, ect. werden über Parameter angefügt und so kann nichts vergessen werden. Doch auch die selbst erstellte Variante hat ihre Vorteile.

Ich möchte mehrere Scripte vorstellen, zuerst die selbst erstellen und anschließend gehe ich auf die cmdlet Send-MailMessage kurz ein. Das erste Script ist für einen Exchange Server gedacht. Hier muss der Name des Exchange bekannt sein und der auszuführende User muss entsprechend berechtigt sein.

Was wird benötigt?

Um erfolgreich eine Mail zu versenden muss ein neues Objekt eines SMTP-Client erzeugt werden, dann wird der Host (in diesem Falle der Exchange Server) benötigt. Zudem muss es einen Absender sowie einen Adressanten geben. Der Betreff (engl. Subject) der E-Mail ist nicht zwingen erforderlich, ebenso wie die Information ob es eine HTML-Mail ist. Der Body, also der eigentliche Inhalt der E-Mail sollte allerdings vorhanden sein. Ich habe alle nötigen Eigenschaften in eine Funktion namens sendmail($body) geschrieben und unterhalb den Inhalt der Mail in der Variable $body gespeichert. Anschließend wird die Funktion einfach aufgerufen und der Inhalt übergeben.

Bei $mailmessage.To.add() müssen die Klammern auch bei nur einem Adressanten gesetzte werden, da es sich hierbei um ein Array handelt. Demzufolge können natürlich mehrere Empfänger hinzugefügt werden. Ebenso ist es möglich auch BBC einzurichten. Also Empfänger die nicht in der E-Mail genannt bzw. angezeigt werden.

Das Script nun noch einmal mit einem Anhang. Dafür wird der Pfad der anzuhängenden Datei benötigt, zudem muss eine Objekt-Instanz erzeugt werden und diese an die E-Mail angehangen werden.

Es können auch über gängige Provider wie GMX, Web.de und andere einfach E-Mails verschickt werden. Dies ist ebenfalls mit und ohne Anhang möglich. Hierbei werden weniger Informationen benötigt als bei dem Script für den Exchange. Es muss wieder eine SMTP-Objekt instanziiert werden, hier wird auch gleich der SMTP-Client des Providers angeben. In meinem Fall ist das mail.gmx.net. Eine List der SMTP, POP3 oder IMAPs der verschieden Provider findet man einfach im Internet oder auf der entsprechenden Seiten des Providers. Es kann auch anstatt des DNS-Namen die IP-Adresse des SMTP-Clients angegeben werden. Die kann mittels CMD-Befehl ping mail.gmx.net ermittelt werden. So ist die IP-Adresse für GMX IPv4  213.165.64.21. Allerdings wird für dieses Verfahren die Authentifizierung benötigt. Dies geschieht je nach Provider mit einem Anmeldenamen oder der E-Mail-Adresse. Das Password wird natürlich auch benötigt. Um erfolgreich die Mail zu versenden müssen folgende Kriterien in folgender Reihenfolge angeben werden: ,,,. Es  können hier auch $Variablen eingesetzt werden, die vorher definiert wurden.

Das Script jetzt nochmal mit Anhang und in einer ähnlichen  Schreibweise, angelehnt an das Exchange-Script. Hier wird bei $smtp.send() nur noch die $Variable $MailMessage angehangen. Diese Variante ist zwar länger, sieht aber deutlich übersichtlicher aus.

Es gibt auch die Möglichkeit, dass das Passwort sowie der Benutzername nicht hinterlegt sein müssen. Dies wird mittels der cmdlet get-credential realisiert. Diese Fragt dann Benutzernamen und Passwort ab und sieht wie folgt aus.

get-credential

Hier wieder die kurze Variante des Scriptes allerdings mit Authentifizierung.

Anschließend komme ich noch auf die ab PowerShell 2.0 verfügbare Funktion Send-MailMessge ein. Es werden wieder alle benötigten Informationen als Parameter übergeben. Dies können auch wieder Variablen sein.

Wer gerne noch mehr Informationen zur cmdlet möchte, kann sich den Artikel von Wolfgang Sommergut zum Thema Send-MailMessage auf WindwosPro anschauen.Er hat einen sehr guten uns ausführlichen Artikel dazu verfasst. Auf Colorconsole.de sind alle Eigenschafen aufgelistet.

rewe