Crontab und Aufgabenplanung mit der PowerShell

Im letzten Blogeintrag haben wir uns außer der Reihe die Berechnung der Zahl Pi mit der PowerShell angesehen.

In diesem Blogeintrag geht es um die Windows Aufgabenplanung bzw. Scheduled Tasks.

In der Linux Welt wird dies mit dem Befehl crontab umgesetzt.

Vor Urzeiten beginnend mit Windows NT wurden sich wiederholende Aufgaben mit dem Kommandzeilen Tool at.exe verwaltet.

Dieser Urahn wurde beginnend mit Windows 2003 / XP vom Nachfolger schtasks.exe abgelöst. Aber erst mit Windows 10 wurde der alte Befehl at.exe deaktiviert.

Unter Windows 7 war es noch möglich, die Aufgaben mit at zu verwalten. Dies wurde allerdings vermehrt von Hackern genutzt, um ihre Angriffe zu verschleiern.

Mit folgendem Befehl wurde eine Aufgabe angelegt, die jede Nacht um 01:00 den Windows Taschenrechner gegen eine "angepasste" Version aus dem Temp Verzeichnis austauscht.

at 01:00 cmd /c copy c:\temp\calc.exe c:\windows\system32\calc.exe /Y

In der Linux Welt werden geplante Aufgaben über den Cron Deamon ausgelöst. Das Verwaltungstool dazu nennt sich crontab.

Mit crontab -l werden bestehende Aufgaben eines Benutzers aufgelistet, mit crontab -e neue Aufgaben hinzugefügt. Das Ganze hübsch in der Kommandozeile und nicht wirklich intuitiv.

Wie so oft in der Linux Welt heißt es RTFM. Weitere Detail zu cron und crontab finden sich bei Wikipedia.

Das PowerShell Equivalent zu cron/crontab, at.exe oder schtask.exe lässt sich leicht mit google und Get-Command finden.

Frage an Google: Was heißt geplante Aufgaben auf Englisch?

Antwort von Google: scheduled tasks

Frage an die PowerShell: Welche Befehle nutzen diese englischen Worte?

Antwort von der PowerShell: Get-Command *-Scheduled*Task* | FT Name

D:\> Get-Command *-Scheduled*Task* | FT Name

Name
----
Disable-ScheduledTask
Enable-ScheduledTask
Export-ScheduledTask
Get-ScheduledTask
Get-ScheduledTaskInfo
New-ScheduledTask
New-ScheduledTaskAction
New-ScheduledTaskPrincipal
New-ScheduledTaskSettingsSet
New-ScheduledTaskTrigger
Register-ScheduledTask
Set-ScheduledTask
Start-ScheduledTask
Stop-ScheduledTask
Unregister-ScheduledTask

Eine neue Aufgabe für einen Benutzer erstellen

Dies entspricht dem crontab -e

Genauso wie in der grafischen Aufgabenplaung mit mehrere tabs wird zuerst eine Aufgabenplanung zusammengesetzt

Eine Aktion erstellen. Was soll ausgeführt werden?

$aktion = New-ScheduledTaskAction -Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument "C\PS\doit.ps1"

Hier soll ein PowerShell Script C:\PS\doit.ps1 gestartet werden. Durch die Angabe des vollen Pfades zur powershell.exe ist es für Angreifer schwerer, diese gegen eine andere Version in einem anderen Pfad zu ersetzen

 

Einen Zeitplan erstellen. Wann soll es ausgeführt werden?

$zeitplan = New-ScheduledTaskTrigger -Daily -At 02:00

Bitte täglich um 02:00 ausführen

 

Einstellungen erstellen. Welche besonderen Einstellungen sollen mitgegeben werden?

$einstellungen = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 15)

 

Die Aufgabe als Objekt erstellen. Alles wird zusammengefasst

$aufgabe = New-ScheduledTask -Action $aktion -Trigger $zeitplan -Settings $einstellungen

 

Die Aufgabe im Aufgabenplaner auf einen Benutzer registrieren

Register-ScheduledTask -TaskName "doit" -InputObject $aufgabe -User "dummy" -Password "C0mplex123"

 

Alle Befehle noch einmal zusammengefasst

$aktion = New-ScheduledTaskAction -Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument "C:\PS\doit.ps1"
$zeitplan = New-ScheduledTaskTrigger -Daily -At 02:00
$einstellungen = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 15)
$aufgabe = New-ScheduledTask -Action $aktion -Trigger $zeitplan -Settings $einstellungen
Register-ScheduledTask -TaskName "doit" -InputObject $aufgabe -User "dummy" -Password "C0mplex123"

 

Bestehende Aufgaben von einem Benutzer auslesen

Ein crontab -l = Liste alle Aufgaben für den angemeldeten Benutzer auf

$env:USERNAME zeigt mir den angemeldeten Benutzernamen

PS D:\> $env:USERNAME
bbirneder

Mit folgendem Befehl bekomme ich alle Aufgaben angezeigt, die im Kontext des angemeldeten Benutzers laufen

Get-ScheduledTask | Where-Object {$_.Principal.userid -eq ($env:USERNAME)} | ft TaskName,{$_.Principal.userid} -a

Get-ScheduledTask | Where-Object {$_.Principal.userid -eq ($env:USERNAME)} | ft TaskName,{$_.Principal.userid} -a

 

 

Eine bestehende Aufgaben anpassen

Einstellungen erstellen. Welche besonderen Einstellungen sollen angepasst werden?

$einstellungen = New-ScheduledTaskSettingsSet -Disable

Die Aufgabe Anpassung im Aufgabenplaner für den Benutzer anpassen

Set-ScheduledTask -TaskName "doit" -Settings $einstellungen -User "dummy" -Password "C0mplex123"

$einstellungen  = New-ScheduledTaskSettingsSet -Disable
Set-ScheduledTask -TaskName "doit" -Settings $einstellungen -User "dummy" -Password "C0mplex123"

 

 

Viele weiter mögliche Optionen werden in den Microsoft Docs beschrieben

 

 

2 Kommentare

  • Antworten $PSUser |

    Tippfehler:
    1. Get-Command *-ScheduledT*Task* –> Get-Command *-ScheduledTTask*
    2. ‚C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe‘ –Argument ‚C:\PS\doit.ps1‘ –> ‚…‘
    3. Register-ScheduledTask –TaskName ‚doit‘ –InputObject $aufgabe –User ‚dummy‘ –Password ‚C0mplex123‘ –> ‚…‘
    Überall in den Codes auch falsche Hochkommata!

    • Antworten Boris Birneder |

      Danke für den Hinweis. Ein Plugin war nicht mehr zur WordPress Version kompatibel.
      Jetzt passen die Hochkommata wieder

Was denken Sie?