- PowerShell 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| Changelog.md | ||
| FullSystemUpdate.ps1 | ||
| Readme.md | ||
FullSystemUpdate
Volledig onbeheerde systeemupdate voor Windows client, Windows Server en legacy systemen. Werkt Windows, winget-pakketten, Microsoft Store-apps en Microsoft 365 Apps bij zonder gebruikersinteractie, en biedt daarna een herstartmelding met automatische fallback.
Het script detecteert eerst zelf het OS-profiel en schakelt bronnen die niet ondersteund worden netjes uit — dezelfde FullSystemUpdate.ps1 draait dus op Windows 11, Server 2025, Server Core én Server 2012 R2.
Ondersteuningsmatrix
| Platform | Build | Windows Update | Winget | Store | Office C2R | Herstartmelding |
|---|---|---|---|---|---|---|
| Windows 11 | 22000+ | PSWindowsUpdate | ✅ ingebouwd | ✅ | ✅ | GUI-dialoog |
| Windows 10 1809+ | 17763+ | PSWindowsUpdate | ✅ ingebouwd | ✅ | ✅ | GUI-dialoog |
| Windows 8.1 / 7 SP1 | 9600 / 7601 | COM-fallback | ❌ | ❌ | ✅ | GUI-dialoog |
| Server 2025 | 26100+ | PSWindowsUpdate | ✅ voorgeïnstalleerd | ❌ | ✅ | GUI / Core-fallback |
| Server 2022 | 20348 | PSWindowsUpdate | ⚠️ via -InstallWingetIfMissing |
❌ | ✅ | GUI / Core-fallback |
| Server 2019 / 2016 | 17763 / 14393 | PSWindowsUpdate | ❌ | ❌ | ✅ | GUI / Core-fallback |
| Server 2012 R2 / 2008 R2 | 9600 / 7601 | COM-fallback | ❌ | ❌ | ✅ | GUI / Core-fallback |
⚠️ Winget is op Windows Server 2022 door Microsoft niet officieel ondersteund — het werkt, maar gebruik het bewust in productie. Op Server 2025 is winget wél volwaardig meegeleverd.
Updatebronnen
| Stap | Bron | Methode |
|---|---|---|
| 1 | Windows Update + Microsoft Update | PSWindowsUpdate (Install-WindowsUpdate -AcceptAll -IgnoreReboot -IgnoreUserInput), 2 passes |
| 1b | Legacy fallback | Native COM API (Microsoft.Update.Session), EULA's automatisch geaccepteerd, updates die invoer vereisen worden overgeslagen |
| 2 | Winget | winget upgrade --all --silent --include-unknown --accept-package-agreements --accept-source-agreements --disable-interactivity --force |
| 3 | Microsoft Store | WMI/MDM MDM_EnterpriseModernAppManagement_AppManagement01::UpdateScanMethod |
| 4 | Microsoft 365 Apps (C2R) | OfficeC2RClient.exe /update user displaylevel=false forceappshutdown=true updatepromptuser=false |
Over "meldingen doorklikken"
Het script klikt geen UI-meldingen weg. In plaats daarvan wordt elk updatekanaal aangestuurd met zijn officiële unattended-parameters, zodat er nooit een prompt verschijnt. Dat is de betrouwbare variant: UI-automatisering breekt bij elke UI-wijziging, werkt niet onder SYSTEM zonder ingelogde sessie en is niet idempotent.
De enige melding die wél getoond wordt, is de herstartvraag aan het einde.
Update-engine
-UpdateEngine |
Gedrag |
|---|---|
Auto (standaard) |
PSWindowsUpdate wanneer PowerShell 5.1+ en PSGallery bereikbaar zijn, anders automatisch COM |
PSWindowsUpdate |
Forceer de module; valt alsnog terug op COM als installatie mislukt |
COM |
Forceer de native Windows Update COM API — geen PSGallery, geen internetmodule, werkt vanaf Windows 7 / Server 2008 R2 |
Gebruik -UpdateEngine COM op afgeschermde servers zonder toegang tot PSGallery.
Vereisten
- Minimaal: PowerShell 3.0 en administratieve rechten
- Voor PSWindowsUpdate: PowerShell 5.1 (op Windows 7 / Server 2008 R2 / 2012 R2 vereist dit WMF 5.1, anders gebruikt het script automatisch COM)
- TLS 1.2 wordt door het script zelf geforceerd
- Internettoegang naar Windows Update, en optioneel PSGallery / github.com / nuget.org
Uitvoeren
# Standaard: alles bijwerken, 60 minuten wachten op herstartkeuze
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\FullSystemUpdate.ps1
# Windows Server 2022: winget automatisch bijplaatsen, niet herstarten
.\FullSystemUpdate.ps1 -InstallWingetIfMissing -NoRestart
# Legacy of afgeschermde server: native COM-engine
.\FullSystemUpdate.ps1 -UpdateEngine COM
# 30 minuten wachttijd, Office overslaan
.\FullSystemUpdate.ps1 -RestartTimeoutMinutes 30 -SkipOffice
Parameters
| Parameter | Type | Standaard | Omschrijving |
|---|---|---|---|
-RestartTimeoutMinutes |
Int (1–1440) | 60 |
Wachttijd op de herstartkeuze voordat geforceerd herstart wordt |
-UpdateEngine |
Auto | PSWindowsUpdate | COM |
Auto |
Welke Windows Update-engine gebruikt wordt |
-InstallWingetIfMissing |
Switch | $false |
Plaats App Installer automatisch (VCLibs + UI.Xaml + msixbundle, provisioned) |
-SkipWindowsUpdate |
Switch | $false |
Sla Windows Update over |
-SkipWinget |
Switch | $false |
Sla winget over |
-SkipStore |
Switch | $false |
Sla Microsoft Store over |
-SkipOffice |
Switch | $false |
Sla Microsoft 365 Apps over |
-AlwaysPromptRestart |
Switch | $false |
Toon de melding ook zonder pending reboot |
-NoRestart |
Switch | $false |
Geen melding en geen herstart — aanbevolen voor DC's en productieservers |
-WorkRoot |
String | %ProgramData%\FullSystemUpdate |
Basismap voor logs en het dialoogscript |
Geplande taak (aanbevolen)
$action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\FullSystemUpdate.ps1"'
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Saturday -At 02:00
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -WakeToRun `
-ExecutionTimeLimit ([TimeSpan]::FromHours(4))
Register-ScheduledTask -TaskName 'FullSystemUpdate' -Action $action -Trigger $trigger `
-Principal $principal -Settings $settings -Force
Draait het script als SYSTEM, dan wordt de herstartmelding via een tijdelijke geplande taak (FullSystemUpdate-RestartPrompt) in de sessie van de ingelogde gebruiker getoond en daarna opgeruimd.
Herstartlogica
| Situatie | Interne code | Gevolg |
|---|---|---|
| "Nu opnieuw opstarten" | 10 |
shutdown /r /f /t 15 |
| "Later" | 20 |
Geen herstart |
| Geen reactie binnen time-out | 30 |
shutdown /r /f /t 60 (geforceerd) |
| Geen interactieve sessie | 30 |
Geforceerde herstart |
| Server Core (geen GUI) | 40 |
shutdown /r /f /t <timeout> met native waarschuwing; afbreekbaar met shutdown /a |
Het dialoogvenster heeft geen sluitknop, staat altijd bovenop en toont een aftellende timer.
Resultaatcodes
| Exitcode | Betekenis |
|---|---|
0 |
Alle stappen zonder kritieke fouten afgerond |
1 |
Eén of meer stappen gaven een [ERROR] (niet-kritieke [WARN]s tellen niet mee) |
2 |
Script niet als administrator gestart |
Logging
- Console-output met status-prefixes:
[OK],[INFO],[WARN],[ERROR] - Logbestand:
%ProgramData%\FullSystemUpdate\Logs\FullSystemUpdate_yyyyMMdd_HHmmss.log - De header logt OS, rol, PowerShell-versie, gekozen engine en de winget/Store-ondersteuning van het systeem
Idempotentie
Modules en de Microsoft Update-service worden alleen geregistreerd wanneer ze ontbreken, winget slaat bijgewerkte pakketten over, App Installer wordt alleen geplaatst als winget.exe echt ontbreekt, en er wordt uitsluitend herstart wanneer er daadwerkelijk een reboot pending is (tenzij -AlwaysPromptRestart).
Aandachtspunten
- Gebruik
-NoRestartop domeincontrollers en productieservers; het script waarschuwt hier zelf ook voor. forceappshutdown=truesluit draaiende Office-applicaties af. Zet dit opfalseinInvoke-OfficeStageals dat ongewenst is.winget --forcenegeert hash-mismatches; verwijder deze vlag in streng beheerde omgevingen.- Store-updates verlopen asynchroon; de scan wordt gestart, de installatie voltooit op de achtergrond.
- Op legacy systemen worden updates die
CanRequestUserInputmelden bewust overgeslagen en als[WARN]gelogd — die vereisen per definitie handmatige interactie. - Voor volledige patching zijn soms twee runs nodig (updates die pas ná een herstart zichtbaar worden).