Microsoft Taskplaner (MSTASK)

Was für Unix-Server das Programm "CRON" ist und unter Windows NT4 als "AT-Befehl" vorhanden war, heißt seit Windows 2000 nun "Microsoft Taskplaner" und ist standardmäßig installiert und aktiv.

Auf der MSXFAQ finden Sie sehr viele Skripts, die eine Überwachung von Exchange erlauben. Allerdings kann und will ein Administrator natürlich nicht regelmäßig diese Skripte immer wieder ausführen. Daher melden die meisten Skripte ihre Ergebnisse im Eventlog oder sogar per Mail. Was nun fehlt, ist ein Mechanismus, um diese Skripte regelmäßig auszuführen. Vor der gleichen Aufgabe stehen auch Programme wie die Datensicherung oder Virenscanner (Patternupdate). Erschreckend oft wird aber die Funktion des Betriebssystems einfach ignoriert und viele Programme bauen eigene Scheduler.

Der Taskplaner

Dass der Taskplaner aktiv ist, erkennen Sie am besten in den Diensten: Dort finden Sie den "Taskplaner" welcher auch automatisch gestartet sein sollte.

Wenn Sie sich die Eigenschaften des Diensts anzeigen, dann sehen Sie, dass dieser als "LocalSystem" läuft. Darauf kommen wir etwas später wieder zurück. Die einzelnen Tasks hingegen können Sie z.B. über den Windows Explorer auf dem System selbst in der Systemsteuerung einsehen und bearbeiten.

Windows XP Taskplaner

Einfache Einrichtung eines Tasks

Über den Assistent kann man sehr einfach einen eigenen Task einstellen. Nach dem Willkommensschirm müssen Sie das gewünschte Programm auswählen. Meist ist natürlich das Skript nicht in der Auflistung mit enthalten, so dass Sie über "Durchsuchen" das gewünschte Programm auswählen müssen:

MSTask04

Sie können COM, EXE,CMD und BAT direkt aufrufen. Wenn Sie ein VBScript (VBS) starten wollen, dann würde ich persönlich immer "CSCRIPT.EXE" mit entsprechenden Parametern starten oder ein BAT/CMD-File drum herum stricken, um den Start und das Ende z.B. mit einem "ECHO %NOW% Skripte gestartet >> Dateiname" protokollieren.

Hier ist dann auch gut zu sehen, dass Sie neben den Zeiten auch "Beim Start des Computers" oder "beim Anmelden" angeben können. Das konnte der alte AT-Befehl von Windows NT 4 nicht. Im nächsten Fenster können Sie dann den Zeitplan einstellen. Der Assistent erlaubt an dieser Stelle nur sehr eingeschränkte Anpassungen. Je nachdem ob Sie Täglich, wöchentlich oder monatlich angegeben haben. verändert sich das folgende Fenster:

Tägliche PlanungWöchentliche Planung Monatliche Planung

Nach der Eingabe des einfachen Zeitplans müssen Sie dann natürlich noch einen Benutzernamen für diesen Dienst hinterlegen

Anmeldedaten

Es ist immer eine gute Idee, entsprechenden Dienstkonten zu verwenden und nicht den Administrator einzutragen. Das vereinfacht später die Änderung des Administratorkennworts. Die Abschlussmeldung erlaubt aber die Aktivierung der erweiterten Optionen.

Genau diese Einstellung ist es aber, die den Taskplaner sehr mächtig macht.

Wenn Sie einen Auftrag jede Stunde ausführen lassen wollen, dann scheint erst einmal keiner der drei Zeitpläne (Täglich, Wöchentlich, Monatlich) zu passen. Aber in den erweiterten Einstellungen können Sie eine Wiederholung einstellen. Ein Job, welcher jede Stunden laufen soll, müssen Sie daher nicht in 24 "täglich" Jobs aufteilen, sondern es reicht ein Job, der um 00:00 des Tages beginnt und sich alle Stunde wiederholt.

Details bearbeiten

Dazu können Sie die Details im Taskplaner bearbeiten. Natürlich ist dies auch der richtige Weg, um Veränderungen vorzunehmen.

Die Checkbox "mehrfache Zeitpläne" erlaubt die wiederholte Planung eines Auftrags, so dass auch stündliche Durchläufe mit einem Auftrag möglich sind.

Eine weitere Kontrolle ist über die Einstellungen möglich. Hier können Aufträge auch abgebrochen werden, wenn diese nicht in der erwarteten Zeit zu ende sind. Dies ist besonders wichtig, da der Taskplaner einen Auftrag nicht mehrfach startet. Wollen Sie daher einen Auftrag jede Stunde starten, obwohl der Durchlauf eines Auftrags länger dauert, dann müssen Sie doch mehrere Jobs anlegen.

Sehr schön ist auch die Übersicht der Aufträge im Explorer. Hier sehen Sie schnell den letzten Aufruf, das Ergebnis und den nächsten geplanten Start.

Achtung: Auch wenn Sie den Taskplaner über "AT" steuern können, so sehen sie über die Kommandozeile nicht alle Aufträge, sondern nur die, die per AT erstellt wurden.

Tasks per Kommandozeile verwalten.

Mehr zufällig habe ich entdeckt, dass der Microsoft Taskplaner nicht nur mittels "AT.EXE" verwaltet eingeschränkt werden kann, sondern dass es auch ein Programm SCHTASKS.EXE (im System32-Verzeichnis)  gibt, welches viel mehr Optionen erlauben. Hier mal eine Bildschirmausgabe meines PCs:

C:\WINDOWS>schtasks /?

SCHTASKS /Parameter [Argumente]

Beschreibung:
    Ermöglicht einem Administrator, geplante Tasks auf einem lokalen
    oder Remotecomputer zu erstellen, abzufragen, zu löschen, zu ändern,
    auszuführen und zu beenden. Ersetzt AT.exe.

Parameterliste:
    /Create         Erstellt einen neuen geplanten Task.
    /Delete         Löscht die geplanten Tasks.
    /Query          Zeigt alle geplanten Tasks an.
    /Change         ändert die Eigenschaften des geplanten Tasks.
    /Run            Führt einen geplanten Task sofort aus.
    /End            Beendet den aktiven geplanten Task.
    /?              Zeigt diese Hilfe an.
Beispiele:
    SCHTASKS
    SCHTASKS /?
    SCHTASKS /Run /?
    SCHTASKS /End /?
    SCHTASKS /Create /?
    SCHTASKS /Delete /?
    SCHTASKS /Query  /?
    SCHTASKS /Change /?

Wem also die einfache Steuerung per AT.EXE nicht reicht, kann mit SCHTASKS den Zeitplandienst steuern. 

Tasks per VBSkript anlegen und verwalten.

Leider habe ich selbst noch keine "Kommandozeile" gefunden, die eine automatische Anlage von Jobs erlaubt. Allerdings ist dies per VBScript möglich. Scheinbar hat sich das aber noch nicht mal bis zu Microsoft bzw. Sybari durchgesprochen, denn deren Virenschutz "(MSXFAQ.DE - Forefront) legt auch noch mit der alten API lieber für jede Stunde einen Job an, anstatt einen einzigen Job jede Stunde wiederholen zu lassen.

' Anlegen eines neuen Auftrags
Set objScheduler = Server.CreateObject("Scheduler.SchedulingAgent.1") 
Set objTask = oScheduler.Tasks.Add("galcomp.job")

objTask.ApplicationName = "C:\galcomp\galcomp.vbs"
objTask.Comment = "Vergleiche Exchange GAL"
objTask.Creator = "VBScript"
objTask.WorkingDirectory = "C:\galcomp"
objTask.SetAccountInformation "msxfaq\svcgalcomp","Password!"

Set objTask = Nothing
Set objScheduler = Nothing
' Starten eines existierenden Auftrags
Set objScheduler = Server.CreateObject("Scheduler.SchedulingAgent.1")
Set objTask = objScheduler.Tasks.Item("galcomp.job")
objTask.Run
Set objTask = Nothing
Set objScheduler = Nothing
' Löschen eines existierenden Auftrags
Set objScheduler = Server.CreateObject("Scheduler.SchedulingAgent.1")
Set objTask = oScheduler.Tasks.Item("galcomp.job")
oScheduler.Tasks.Delete(objTask.JobName)
Set objScheduler = Nothing
Set objTask = Nothing

Alternativ kann der Taskmanager auch über WMI angesprochen werden.

' Create a Scheduled Task (Starting 14:55)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create ("galcomp.vbs", "********145500.000000-420",True,1 Or 4 Or 16, , , JobID)
WScript.Echo errJobCreated

Die beste Quelle ist hierzu natürlich immer wieder das MSDN

Taskplaner und Powershell

AT und MSTask-Programme als "SYSTEM" starten

Aber der Vorgänger des MSTask-Planers wurde sogar nur per Kommandozeile gesteuert. Das Kommando "AT" ist sogar heute noch verfügbar und mit MSTASK nutzbar. Durch diesen Kniff erhält man auch die Möglichkeit, ein Programm als "Local System" oder "Network Service" zu starten, was für die Fehlersuche sehr nützlich sein. Ist "LocalSystem" doch zugleich das Computerkonto (Computername$) unter dem auch Exchange 2000 und höher und andere Dienste laufen. Über diesen Kniff kann ein Administrator einfach feststellen, ob das Computerkonto tatsächlich die erforderlichen Rechte hat.

Um eine DOS-Box als "LocalSystem" zu starten, reicht ein Aufruf von "AT hh:mm /interactive cmd.exe", wobei hh:mm natürlich eine Zeit in der nahen Zukunft (z.B. 2-3 Minuten) ist.

 

Und schon kurze Zeit später wird sich eine DOS-Box mit den Rechten des MSTASK-Diensts öffnen. Bei Windows-XP und Windows 2003 ist dies der "Netzwerkservice". Entsprechend präsentiert sich die DOS-Box. Der Wert der Umgebungsvariable "UserPROFILE" verrät den Benutzer. Wer "WHOAMI" (Windows Support Tools) installiert hat, kann noch mehr Informationen erhalten. 

ändert man die Einstellungen des Task-Schedulers auf "LocalSystem", dann lassen sich Programme auch mit diesen Rechten starten.

Eine Sicherheitslücke ist dies indes nicht, denn normale Benutzer haben keine Berechtigungen, um per AT Befehle einzustellen. Übrigens kann man auch per GUI diese Einträge vornehmen. Man muss nur den "richtigen" Benutzer eintragen. Versuchen Sie es einfach mal mit "NT AUTHORITY\SYSTEM". Die Abfrage nach dem Kennwort einfach ohne Eingabe eines Kennworts bestätigen.

Taskplaner und NTBACKUP

Wenn Sie mit NTBACKUP eine Datensicherung erstellen und planen, dann wird auch darauf ein geplanter Auftrag des Task-Schedulers. Die Anzeige in NTBACKUP ist eine gefilterte Ansicht auf den Taskplaner

Auch hier sehen Sie, dass NTBACKUP sicher einfach des Windows Taskplaners bedient, um mit einer passenden Kommandozeile die Sicherung zu starten.

Wiederholungen

Wenn Sie einen Task so einstellen, dass er z.B. alle 5 Minuten wiederholt wird, dann ist es wichtig zu wissen, ab wann die 5 Minuten zählen. Ab dem Ende des vorherigen Jobs oder immer alle 5 Minuten als Startzeit. Das Eventlog gibt zumindest ab Windows 2012 darüber genau Auskunft:

Es ist wirklich der Startzeitpunkt.

Besonderheiten mit MSTASK

Mehr als Einmal konnte ich folgendes Verhalten beobachten, wenn ich einen Task habe, der z.B. alle 10 Minuten startet: Wenn der MSTask-Planer normal beendet und wieder gestartet wird, dann wird auch der Prozess weiter geführt. Wird der Server jedoch gebootet, dann scheint der Taskplaner diesen Job erst wieder nach Mitternacht auszuführen (00:00 Uhr). Bislang konnte ich noch nicht erkennen, warum sich ein System so und das andere anders verhält.

Performance und Tasks

Windows unterscheidet sehr wohl zwischen "interaktiven Prozessen" und "geplanten Prozessen". Darunter fallen keine Dienste. Aber "Tasks" werden mit einer niedrigeren Priorität gestartet. Mittels Process Explorer können Sie sowohl die unterschiede bei der CPU- und I/O-Priorität sehen. Der Prozess 958 wurde per Taskplaner mit "8=Below Normal) gestartet während das rechte Fenster eine normale interaktive CMD-Box zeigt.

Anscheinend startet der Taskplaner seine Jobs mit weniger Priorität. Um das wieder zu ändern, können Sie den Task als XML-Datei exportieren und da drin, den Wert für Priorität z.B.: auf auf 8=Normal ändern und den Task wieder mittels der XML-Datei neu anlegen.

Weitere Links