Task planning revised

This commit is contained in:
Patrick Asmus
2026-07-14 19:28:08 +02:00
parent e7d116b099
commit e18e399ba7

View File

@@ -51,24 +51,58 @@ Den Rest wie oben, nur den Trigger austauschen.
### Monatlich (z.B. erster Montag im Monat um 04:00 Uhr) ### Monatlich (z.B. erster Montag im Monat um 04:00 Uhr)
```powershell `New-ScheduledTaskTrigger` bietet keine `-Monthly`-Option mit Wochentag, und die CIM-Klasse
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -WeeksInterval 1 -At "04:00" `MSFT_TaskMonthlyDOWTrigger` wird von `Register-ScheduledTask` nicht akzeptiert ("Falscher Parameter").
Daher wird die Aufgabe per XML über `schtasks.exe` erstellt:
# New-ScheduledTaskTrigger bietet kein -Monthly mit Wochentag-Option, ```powershell
# daher wird der CIM-Trigger verwendet (entspricht GUI → "Monatlich"): $startDate = (Get-Date "04:00").ToString("yyyy-MM-dd'T'HH:mm:ss")
$trigger = New-CimInstance -CimClass ( $xml = @"
Get-CimClass -Namespace "Root/Microsoft/Windows/TaskScheduler" ` <?xml version="1.0" encoding="UTF-16"?>
-ClassName "MSFT_TaskMonthlyDOWTrigger" <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
) -ClientOnly -Property @{ <Triggers>
DaysOfWeek = [int16]2 # Montag (So=1, Mo=2, Di=4, Mi=8, Do=16, Fr=32, Sa=64) <CalendarTrigger>
WeeksOfMonth = [int16]1 # Erste Woche <StartBoundary>$startDate</StartBoundary>
Months = [int16]4095 # Alle 12 Monate (Bit-Summe: 1+2+4+...+2048) <Enabled>true</Enabled>
Enabled = $true <ScheduleByMonthDayOfWeek>
} <Weeks><Week>1</Week></Weeks>
$trigger.StartBoundary = (Get-Date "04:00").ToString("yyyy-MM-dd'T'HH:mm:ss") <DaysOfWeek><Monday /></DaysOfWeek>
<Months>
<January /><February /><March /><April /><May /><June />
<July /><August /><September /><October /><November /><December />
</Months>
</ScheduleByMonthDayOfWeek>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Actions Context="Author">
<Exec>
<Command>powershell.exe</Command>
<Arguments>-ExecutionPolicy Bypass -NoProfile -File "C:\scripts\windows-updater\windows-updater.ps1"</Arguments>
</Exec>
</Actions>
<Settings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<StartWhenAvailable>true</StartWhenAvailable>
<AllowHardTerminate>true</AllowHardTerminate>
<ExecutionTimeLimit>PT2H</ExecutionTimeLimit>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
</Settings>
</Task>
"@
$xmlPath = "$env:TEMP\windows-updater-monthly.xml"
$xml | Out-File -FilePath $xmlPath -Encoding Unicode
schtasks.exe /Create /TN "Windows Updater - Monthly" /XML $xmlPath /F
Remove-Item $xmlPath
``` ```
Den Rest wie beim täglichen Beispiel, nur den Trigger austauschen. **Wochentag/Woche anpassen**: `<Monday />` durch den gewünschten Tag ersetzen (`<Sunday />`, `<Tuesday />`, etc.), `<Week>1</Week>` durch die gewünschte Woche (1-4) oder `<Last />` für die letzte Woche.
### Defender-Updates alle 4 Stunden ### Defender-Updates alle 4 Stunden
@@ -105,40 +139,52 @@ Zwei Aufgaben anlegen — eine für Defender (häufig), eine für alle Updates (
```powershell ```powershell
# Aufgabe 1: Defender alle 4 Stunden (wie oben) # Aufgabe 1: Defender alle 4 Stunden (wie oben)
# Aufgabe 2: Volle Updates monatlich am ersten Sonntag um 03:00 # Aufgabe 2: Volle Updates monatlich am ersten Sonntag um 03:00
$action = New-ScheduledTaskAction ` $startDate = (Get-Date "03:00").ToString("yyyy-MM-dd'T'HH:mm:ss")
-Execute "powershell.exe" ` $xml = @"
-Argument "-ExecutionPolicy Bypass -NoProfile -File `"C:\scripts\windows-updater\windows-updater.ps1`"" <?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
$trigger = New-CimInstance -CimClass ( <Triggers>
Get-CimClass -Namespace "Root/Microsoft/Windows/TaskScheduler" ` <CalendarTrigger>
-ClassName "MSFT_TaskMonthlyDOWTrigger" <StartBoundary>$startDate</StartBoundary>
) -ClientOnly -Property @{ <Enabled>true</Enabled>
DaysOfWeek = [int16]1 # Sonntag <ScheduleByMonthDayOfWeek>
WeeksOfMonth = [int16]1 # Erste Woche <Weeks><Week>1</Week></Weeks>
Months = [int16]4095 # Alle 12 Monate <DaysOfWeek><Sunday /></DaysOfWeek>
Enabled = $true <Months>
} <January /><February /><March /><April /><May /><June />
$trigger.StartBoundary = (Get-Date "03:00").ToString("yyyy-MM-dd'T'HH:mm:ss") <July /><August /><September /><October /><November /><December />
</Months>
$principal = New-ScheduledTaskPrincipal ` </ScheduleByMonthDayOfWeek>
-UserId "SYSTEM" ` </CalendarTrigger>
-RunLevel Highest ` </Triggers>
-LogonType ServiceAccount <Principals>
<Principal id="Author">
$settings = New-ScheduledTaskSettingsSet ` <UserId>S-1-5-18</UserId>
-AllowStartIfOnBatteries ` <RunLevel>HighestAvailable</RunLevel>
-DontStopIfGoingOnBatteries ` </Principal>
-StartWhenAvailable ` </Principals>
-ExecutionTimeLimit (New-TimeSpan -Hours 2) <Actions Context="Author">
<Exec>
Register-ScheduledTask ` <Command>powershell.exe</Command>
-TaskName "Windows Updater - Monthly" ` <Arguments>-ExecutionPolicy Bypass -NoProfile -File "C:\scripts\windows-updater\windows-updater.ps1"</Arguments>
-Action $action ` </Exec>
-Trigger $trigger ` </Actions>
-Principal $principal ` <Settings>
-Settings $settings ` <AllowStartOnDemand>true</AllowStartOnDemand>
-Description "Vollständige Windows Updates monatlich" <StartWhenAvailable>true</StartWhenAvailable>
<AllowHardTerminate>true</AllowHardTerminate>
<ExecutionTimeLimit>PT2H</ExecutionTimeLimit>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
</Settings>
</Task>
"@
$xmlPath = "$env:TEMP\windows-updater-monthly.xml"
$xml | Out-File -FilePath $xmlPath -Encoding Unicode
schtasks.exe /Create /TN "Windows Updater - Monthly" /XML $xmlPath /F
Remove-Item $xmlPath
``` ```
### Bestehende Aufgabe ändern ### Bestehende Aufgabe ändern