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
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!
Danke für den Hinweis. Ein Plugin war nicht mehr zur WordPress Version kompatibel.
Jetzt passen die Hochkommata wieder