PowerShell

Arbeiten mit Tasks in PowerShell V02/V03 und V04

Arbeiten mit Tasks in PowerShell V02/V03 und V04

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.

Tasks_PS_Bild_01

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.

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"
        }
    }

Tasks_PS_Bild_02

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"
        }
    }

Tasks_PS_Bild_03

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"
        }
    }

Tasks_PS_Bild_04

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:

$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

Tasks_PS_Bild_05

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:

# Delete me
Remove-Item $MyINvocation.InvocationName

Die Automatisierung mittels Tasks hat uns schon in vielen Migrationsprojekten helfen können

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.