single.php
< Beitrag von Tobias Heyl

PowerShell-Skripte mit UNC-Pfaden in der Aufgabenplanung

Die Aufgabenplanung in Windows ist ein wichtiges Werkzeug, wenn es darum geht, bestimmte sich wiederholende Aufgaben auszuführen – und zwar gänzlich automatisiert. Gerade im Server-Bereich lassen sich so Aufgaben hinterlegen, die dann ausgeführt werden, wenn der Einfluss auf die Mitarbeiter weniger groß ist, also bspw. zur Nachtzeit oder am Wochenende. Wieso PowerShell-Skripte mit UNC-Pfaden in der Aufgabenplanung eine wichtige Rolle spielen, zeigt dieser Artikel.

Speicherorte entscheiden über Aufruf-Parameter

In meinem heutigen Beitrag möchte ich nicht darüber schreiben, wie die Aufgabenplanung funktioniert und wie diese generell eingerichtet wird, sondern darüber, wie sich Aufruf und Syntax der Aufgabenplanung ändern, wenn das aufgerufene Skript via PowerShell gewisse Parameter erwartet, die an das Skript übergeben werden. Dabei macht es durchaus einen Unterschied, von wo aus das Skript aufgerufen wird.

Dazu stellen wir uns folgende Aufgabe vor:

Ein Programmierer soll ein PowerShell-Skript erstellen, mit dessen Hilfe bestimmte Freigaben-Ordner gescannt und geprüft werden sollen. Dabei werden in 3 verschiedenen UNC-Pfaden (UNC = Uniform Naming Convention) bestimmte Ordner analysiert und anschließend via Skript neu berechtigt.

Es gibt nun mehrere Möglichkeiten, diese Aufgabe umzusetzen:

  1. Ein einzelnes Skript, das mehrere gleiche Aufgaben hintereinander abarbeitet, also erst Korrektur der Ordner in Freigabe #1 vornimmt, dann die Korrektur der Ordner in Freigabe #2 usw.
  2. 3 grundsätzlich gleiche Skripte, eines gesondert für jede Freigabe mit derselben Aufgabe, jeweils angepasst an den Pfad, in dem es wirken soll.
  3. Ein einzelnes Skript mit einer definierten Aufgabe, das als Parameter den Freigabe-Ordner übergeben bekommt, in dem es wirken soll.
Programmaufruf mit optionalen Argumenten PowerShell-Skripte mit UNC-Pfaden

Programmaufruf mit optionalen Argumenten

Möglichkeit 1 – 1 Skript mit mehreren gleichen Aufgaben – hat den Nachteil, dass das Skript – je nach Komplexitätsgrad – unübersichtlich und groß werden kann. Wenn das Skript einen Fehler enthält, muss dieser Fehler gleich 3 Mal an 3 unterschiedlichen Stellen im Skript korrigiert werden.

Möglichkeit 2 – 3 gleiche Skripte – hat denselben Nachteil wie Variante 1, nämlich dass im Fehlerfall mehrere Skripte angepasst werden müssen. Außerdem muss für jedes Skript ein gesonderter Aufruf definiert und eine gesonderte Datei abgespeichert werden. Des Weiteren darf man infrage stellen, wieso man 3 Skripte braucht, um nur eine Aufgabe auszuführen.

Möglichkeit 3 – 1 Skript mit einer definierten Aufgabe – ist vermutlich am sinnvollsten. Zwar muss auch hier für jeden Durchlauf ein gesonderter Aufruf in der Aufgabenplanung definiert werden, jedoch ist die Skript-Basis ein einzelnes Skript, welches im Fehlerfall schnell und einfach anpassbar ist und hier die Parameter innerhalb der aufrufenden Aufgabenplanung darüber entscheiden, in welchem Verzeichnis bzw. mit welchen Einstellungen dieses Skript ausgeführt wird.

Beispiel-Aufruf mit lokalem Pfad

Beim lokalen Aufruf wird die PowerShell-Konsole aufgerufen und an diese ein lokales Skript, hier PowerShell-Script.ps1 übergeben. Der Parameter -file ist optional. Bei Pfaden mit Leerzeichen ist der Pfad zum Skript in doppelte Anführungszeichen zu setzen.

Beispiel-Aufruf mit lokalem Pfad und Parameter(n)

Hier ändert sich der erste Aufruf-Parameter von -file nach -Command. Außerdem ist ersichtlich, dass der gesamte Pfad inkl. der Parameter in doppelten Anführungszeichen steht. Parameter-Namen werden wie üblich mit einem vorangestellten Bindestrich gekennzeichnet, der Parameter selbst steht dahinter im Klartext ohne weitere Filter oder Angaben. Neu hinzugekommen ist das Et-Zeichen (auch bekannt als kaufmännisches Und), welches die Kette anführt und somit einleitet.

Beispiel-Aufruf mit UNC-Pfad

Hier ist es wie beim lokalen Aufruf. Der Parameter -file ist optional. Der gesamte UNC-Pfad ist in doppelte Anführungszeichen zu setzen.

Beispiel-Aufruf mit UNC-Pfad und Parameter(n)

Dies ist der komplexeste Aufruf, bei dem sowohl ein UNC-Pfad als auch Parameter mit aufgerufen werden. Die Syntax ändert sich hier abermals, weil nun der UNC-Pfad nur noch in einfachen Anführungszeichen stehen darf. Das Et-Zeichen ist ebenfalls enthalten und leitet den Aufruf ein, Parameter-Namen – dies bleibt gleich – werden mit vorangestelltem Bindestrich aufgerufen, die Parameter selbst dahinter schnörkellos im Klartext.

Wir betrachten oben 4 verschiedene Arten, ein Skript – abhängig von seinem Speicherort – in und mit der Aufgabenplanung aufzurufen. Da der Pfad und die Parameter den Aufruf beeinflussen, muss man hier vorsichtig sein, denn wenn ein Anführungszeichen vergessen oder falsche Anführungszeichen verwendet werden, scheitert der ganze Aufruf und das Skript kann nicht laufen.

Der richtige Account – erst dann sind Skripte in der Aufgabenplanung sinnvoll!

Es ist überdies ratsam, ein vom aktuell angemeldeten Benutzer unabhängiges Konto zu erstellen, mit dem die Aufgabe verknüpft wird. Dieses Benutzerkonto benötigt die notwendige Berechtigung, die Aufgabe(n) aus dem Skript abzuarbeiten. In diesem Zusammenhang spricht man auch von Service-Konten, also AD-Konten, die extra angelegt wurden, um spezifisch eine oder mehrere gleichartige Aufgaben auszuführen.

Legt der Programmierer stattdessen nämlich der Bequemlichkeit halber alle Aufgaben mit seinem eigenen Konto an, und ändert sich das Kennwort bspw. nach Ablauf einer Frist, stimmt dieses plötzlich nicht mehr mit dem in der Aufgabenplanung hinterlegten Kennwort überein und die Aufgabe würde nicht mehr laufen.

Das Thema „automatisierte Skriptausführung“ bietet also durchaus ein paar Fallstricke, die es zu beachten gilt. Sofern sich an die Konventionen gehalten wird, steht aber auch bei Ihnen der Einrichtung von Skripten über UNC-Pfade und dem Aufruf weiterer Parameter nichts mehr im Wege.

Folgen
X

Folgen

E-mail : *
Kategorie: Datacenter | Schlagwörter: , , , , | Kommentare: 0

Beitrag kommentieren

CAPTCHA * Time limit is exhausted. Please reload CAPTCHA.