Der Windows Task Scheduler ist ein mächtiges Werkzeug für die Automatisierung innerhalb von Windows Betriebssystemen. Nicht ohne Grund verwendet Microsoft Tasks für die Automatisierung diverser Aufgaben der Betriebssysteme. Ein Beispiel hierfür ist die Defragmentierung lokaler Datenträger.
Besonders nützlich sind Tasks, wenn Aufgaben im System Kontext ausgeführt werden müssen. Um solch einen Tasks anzulegen, muss der User über lokale Administrator Rechte auf dem Zielsystem verfügen.
Bis PowerShell V04 musste das Commandline Tool schtasks.exe verwendet werden um Tasks lokal oder auch remote zu erstellen, auszuführen oder zu löschen. Die Parameter lassen sich unter folgendem Link einsehen Schtasks.exe. Nichtsdestotrotz kann Schtasks.exe innerhalb von PowerShell Funktionen verwendet werden. Anbei sind drei simple PowerShell Funktionen aufgezeigt, welche die Erstellung, die Ausführung und das Löschen von Tasks erlauben. Die verwendeten Taskzeiten sind nur beispielhaft zu verstehen.
[code language=“powershell“]
Function CreateScheduledTask
{
# This function allows you to create a system task on a local or remote system.
param(
[String]$ComputerName = "localhost",
[String]$User = "SYSTEM",
[String]$TaskName = "RunScript",
[String]$TaskRun = ‚"powershell.exe C:\Temp\Script.ps1"‘,
[String]$Schedule = "Daily",
[String]$Interval = "60",
[String]$Duration = "120"
)
$Command = "schtasks.exe /Create /s $ComputerName /ru $User /tn $TaskName /tr $TaskRun /sc $Schedule /ri $Interval /DU $Duration /F"
$Execution = Invoke-Expression $Command
if($Execution -match "SUCCESS: The scheduled")
{
Write-Host "The Task $TaskName has been scheduled successfully on $ComputerName!" -ForegroundColor Green
}
else
{
Write-Error "Error scheduling Task $TaskName on $ComputerName"
}
}
[/code]

[code language=“powershell“]
Function RunScheduledTask
{
# This function allows you to run a system task on a local or remote system.
param(
[String]$ComputerName = "localhost",
[String]$TaskName = "RunScript"
)
$Command = "schtasks.exe /Run /s $ComputerName /tn $TaskName"
$Execution = Invoke-Expression $Command
if($Execution -match "SUCCESS: Attempted to")
{
Write-Host "The Task $TaskName has been run successfully on $ComputerName!" -ForegroundColor Green
}
else
{
Write-Error "Error running Task $TaskName on $ComputerName"
}
}
[/code]
[code language=“powershell“]
Function DeleteScheduledTask
{
# This function allows you to delete a system task on a local or remote system.
param(
[String]$ComputerName = "localhost",
[String]$TaskName = "RunScript"
)
$Command = "schtasks.exe /Delete /s $ComputerName /tn $TaskName /F"
$Execution = Invoke-Expression $Command
if($Execution -match "SUCCESS: The scheduled")
{
Write-Host "The Task $TaskName has been deleted successfully on $ComputerName!" -ForegroundColor Green
}
else
{
Write-Error "Errors deleting Task $TaskName on $ComputerName"
}
}
[/code]
Mit der Verwendung einer foreach-Schleife lassen sich Tasks einfach auf einer Vielzahl von Systemen erstellen, ausführen oder löschen.
Mit PowerShell V04 wurden nun die Funktionalitäten zur Verwaltung von Tasks als Cmdlets integriert. Die drei oben genannten Operationen lassen sich nun wie folgt abbilden:
[code language=“powershell“]
$TaskName = "RunScript"
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "C:\Temp\Script.ps1"
$TaskTrigger = New-ScheduledTaskTrigger -Daily -DaysInterval 1 -At 10am
$TaskUser = "SYSTEM"
$TaskSettings = New-ScheduledTaskSettingsSet
$Task = New-ScheduledTask -Action $TaskAction -Trigger $TaskTrigger -Settings $TaskSettings
# This cmdlet allows you to create a system tass on a local or remote system.
Register-ScheduledTask $TaskName -InputObject $Task -User $TaskUser
# This cmdlet allows you to run a system task on a local or remote system.
Start-ScheduledTask -TaskName $TaskName
# This cmdlet allows you to delete a system task on a local system
Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
[/code]
Die Übersicht über der verfügbaren Parameter für die Cmdlets ist unter dem folgenden Link ersichtlich Scheduled Tasks Cmdlets in Windows PowerShell
Wenn hiermit ein Task auf Remote Systemen erstellt werden soll, müssen CIM_Instanzen oder Remote PowerShell verwendet werden.
In unserem Beispiel wird ein PowerShell Script ausgeführt. Angenommen das Script soll nur einmalig ausgeführt werden und anschliessen gelöscht werden, kann dieses mit der Integration der Funktion DeleteScheduledTask und folgender Befehlszeile:
[code language=“powershell“]
# Delete me
Remove-Item $MyINvocation.InvocationName
[/code]
Die Automatisierung mittels Tasks hat uns schon in vielen Migrationsprojekten helfen können



