# Disable-WindowsUpdate ``` # Requires: Windows PowerShell 5.1+ (Run as Administrator) $ErrorActionPreference = 'Stop' # 0) Admin check $admin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent() ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $admin) { throw "Please run this script as Administrator." } Write-Host "=== DISABLE Windows Update: services, scheduled tasks, and policy ===" # 1) Optional: create a system restore point (may fail on server SKUs or if disabled) try { Checkpoint-Computer -Description "Before_Disable_WU" -RestorePointType "MODIFY_SETTINGS" Write-Host "Restore point created (if supported)." } catch { Write-Host "Skip restore point: $($_.Exception.Message)" } # 2) Stop services $svcToStop = @('wuauserv','UsoSvc','BITS','DoSvc') foreach ($s in $svcToStop) { try { Stop-Service -Name $s -Force -ErrorAction Stop; Write-Host "Stopped: $s" } catch { Write-Host "Stop failed: $s ($($_.Exception.Message))" } } # 3) Disable services $svcToDisable = @('wuauserv','UsoSvc','BITS','DoSvc') foreach ($s in $svcToDisable) { try { Set-Service -Name $s -StartupType Disabled; Write-Host "Disabled: $s" } catch { Write-Host "Disable failed: $s ($($_.Exception.Message))" } } # 4) Disable Windows Update related scheduled tasks $taskList = @( '\Microsoft\Windows\WindowsUpdate\Scheduled Start', '\Microsoft\Windows\WindowsUpdate\AUScheduledInstall', '\Microsoft\Windows\WindowsUpdate\Automatic App Update', '\Microsoft\Windows\WindowsUpdate\sih', '\Microsoft\Windows\WindowsUpdate\sihboot', '\Microsoft\Windows\UpdateOrchestrator\Schedule Scan', '\Microsoft\Windows\UpdateOrchestrator\Schedule Scan Static Task', '\Microsoft\Windows\UpdateOrchestrator\USO_UxBroker_ReadyToReboot', '\Microsoft\Windows\UpdateOrchestrator\Reboot', '\Microsoft\Windows\UpdateOrchestrator\Report policies', '\Microsoft\Windows\UpdateOrchestrator\Resume On Boot', '\Microsoft\Windows\UpdateOrchestrator\Scan', '\Microsoft\Windows\UpdateOrchestrator\StartOobeAppsScan', '\Microsoft\Windows\UpdateOrchestrator\Schedule Maintenance Work', '\Microsoft\Windows\InstallService\ScanForUpdates', '\Microsoft\Windows\WaaSMedic\PerformRemediation' ) foreach ($t in $taskList) { $taskPath = ($t -replace '[^\\]+$','') # keep trailing backslash $taskName = (Split-Path $t -Leaf) try { Get-ScheduledTask -TaskPath $taskPath -TaskName $taskName -ErrorAction Stop | Disable-ScheduledTask | Out-Null Write-Host "Disabled task: $t" } catch { Write-Host "Disable task failed: $t ($($_.Exception.Message))" } } # 5) Apply policies (equivalent to GPO) to block WU $wuRoot = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' $auRoot = Join-Path $wuRoot 'AU' $doRoot = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeliveryOptimization' New-Item -Path $wuRoot -Force | Out-Null New-Item -Path $auRoot -Force | Out-Null New-Item -Path $doRoot -Force | Out-Null # No auto update and remove access New-ItemProperty -Path $auRoot -Name 'NoAutoUpdate' -Value 1 -PropertyType DWord -Force | Out-Null New-ItemProperty -Path $wuRoot -Name 'DisableWindowsUpdateAccess' -Value 1 -PropertyType DWord -Force | Out-Null # Do not connect to Microsoft update internet locations New-ItemProperty -Path $wuRoot -Name 'DoNotConnectToWindowsUpdateInternetLocations' -Value 1 -PropertyType DWord -Force | Out-Null # Block OS upgrade New-ItemProperty -Path $wuRoot -Name 'DisableOSUpgrade' -Value 1 -PropertyType DWord -Force | Out-Null # Point to a dummy WSUS (UseWUServer = 1) to block scans New-ItemProperty -Path $wuRoot -Name 'WUServer' -Value 'http://127.0.0.1:8530' -PropertyType String -Force | Out-Null New-ItemProperty -Path $wuRoot -Name 'WUStatusServer' -Value 'http://127.0.0.1:8530' -PropertyType String -Force | Out-Null New-ItemProperty -Path $auRoot -Name 'UseWUServer' -Value 1 -PropertyType DWord -Force | Out-Null # Delivery Optimization to simple (bypass DO) New-ItemProperty -Path $doRoot -Name 'DODownloadMode' -Value 99 -PropertyType DWord -Force | Out-Null # 6) Enforce policy right away try { gpupdate /target:computer /force | Out-Null } catch { Write-Host "gpupdate failed: $($_.Exception.Message)" } Write-Host "`nAll done. Reboot is recommended." ```