Select when Preview Builds and Feature Updates are received → Enabled → Set to defer for 90 days.
Select when Quality Updates are received → Enabled → Defer for a few days (e.g. 7 days).
Set Windows Update to Low Priority and use only 1 CPU/Core.
This is an extreme option, but the only way to ensure that once you have a real update downloaded, it will be installed at a very low-priority job in the background is to have a process which sets this for you. There are many ways to accomplish this, but here is an explained, simple approach that utilises built-in Windows features and a script.
Which Windows update events are being logged?
We can trigger an event, so we need to first get a picture of what Windows Update puts in the system event logs, from which we can trigger a script to set the priority.
Use Windows Event Viewer to find window update events
Press Windows + R
, type eventvwr.msc
, then hit Enter
You open "Windows Logs" > "System". Either find a mention of Windows update by hand or use the right-hand menu "Filter Current Log" to access Windows update.
The three key pieces of information that trigger an event are the source, which is "WindowsUpdateClient", the Provider Name "Microsoft-Windows-WindowsUpdateClient", and the event ID, which we can see is used in event IDs 19, 20, 43, and 44.
If you open "PowerShell" and run the following script, it will get all the unique event IDs for the provider Name for us with a count of how many times it's been logged.
PowerShell script:
Get-WinEvent -LogName System |
Where-Object { $_.ProviderName -eq "Microsoft-Windows-WindowsUpdateClient" } |
Group-Object Id |
Sort-Object Count -Descending |
Select-Object Name, Count
PowerShell example output:
Name Count
---- -----
44 293
43 265
19 226
20 44
VB Script to lower service window update priority and affinity.
We need a script to take any found Windows update process and set it to low priority, and will only use 1 CPU/CORE by setting the process affinity for us.
This script will also check if there is a subprocess, also known as a child process, from the Windows update service and ensure it has the same enforcement of low priority, etc.
I suggest you have a dedicated folder if you don't already have one for your scripts.
e.g.
C:\Users\YourUserName\Documents\MyScripts
This script will create a log file in the same directory when it runs; in this example it would be called "ServiceEnforcer_[wuauserv]LOG.txt"
Setting up Windows task scheduler to help deprioritise Windows updates.
This built-in window task scheduling tool can be triggered by the Windows event ID we found in the Windows update service, and call this script to enforce the lower priority for us.
There are always multiple ways to achieve this, and you can have one script triggered by many events in one, but I recommend setting up a job for each one. In this example, repeat step 4 four times for event IDs 19, 20, 43, and 44.
These are the steps for 1st one. event ID = 20
Click on the Windows start button and type "Task Scheduler", then launch.
Step 1: On the right-hand menu, select "Create Task"
Step 2: Then complete the 1st tab, known as "
General"
A Name: ServiceEnforcer [wuauserv] [20]
Description: Check for server [wuauserv] triggered from the event [20] and run a script to enforce the service is LOW priority and can only use 1 CPU core.
Selected: Run only when the user is logged on
Selected: Run with the highest privileges
Step 3: Then on 2nd tab "Triggers" press "New..."
Begin this task: On an event
Log: System
Source : WindowsUpdateClient
Event ID: 20 (for this example)
Selected: Enabled.
Press "OK"
Step 4: In the next tab, "Action", press "New..."
Program/script: %windir%\System32\wscript.exe
Add Arguments: ServiceEnforcer.VBS wuauserv 44
Start in: C:\Users\UserName\Documents\MyScripts (location your storing ServiceEnforcer.VBS)
Step 5: The tab "Conditions"
check:
Ensure deselected: Start the task only if the computer is connected to AC power.
Step 6: The last tab "Settings"
All the scheduled event IDs
You have now created a trigger to call the script for the 1st event, do this same step for the next 3 events, you should have a list of task scheduled like below.
You can right-click each one and choose run to ensure the log file in the directory where you stored the script is getting created and showing it working.
Here is an example log output:
07/07/2025 12:01:04 >>> Started Service [wuauserv] Background Enforcer(Event ID[44])
07/07/2025 12:01:05 >>> Check for service [wuauserv] found PID:26760
07/07/2025 12:01:05 >>> Yes service [wuauserv] PID [26760] Set to LOW priority
07/07/2025 12:01:05 >>> Yes service [wuauserv] AFFINITY [26760] Set to CPU 1
07/07/2025 12:01:06 >>> Yes service [wuauserv] PID [26760] Has a child sub process [27340]
07/07/2025 12:01:06 >>> Yes service [wuauserv] PID [27340] Set to LOW priority
07/07/2025 12:01:06 >>> Yes service [wuauserv] AFFINITY [27340] Set to CPU 1
07/07/2025 12:01:06 >>> Finished Service [wuauserv] Background Enforcer
Conclusion
Managing Windows updates doesn’t need to be a frustrating or disruptive experience. With the right approach, you can control bandwidth usage, prevent CPU spikes, and delay non-essential updates—keeping systems stable and performance smooth. These strategies aren’t just about convenience; they’re about maintaining productivity, particularly for small businesses where every bit of computing power counts.
At
Optimised Computing, we understand the nuances of Windows maintenance—from registry tweaks to Group Policy configuration—and we routinely implement tailored solutions to help our customers stay ahead of disruptive updates. Whether you're a home user or a growing business, we make sure your systems update on your terms, not Microsoft's.
If you'd rather focus on running your business than troubleshooting update hiccups, let
Optimised Computing handle the heavy lifting
Comments
Post a Comment