HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Update Windows UpdateWSUSWindows Update for BusinessDual ScanGroup PolicyRegistryIntuneTroubleshooting

A WSUS device installed something WSUS never approved: diagnosing dual scan before you touch a policy

IA
Imran Awan
23 August 2026

A device that has pointed at your WSUS server for four years installs a cumulative update that is not in your WSUS console. Or worse: a user opens Settings, clicks one link, and comes back on a Windows build you never approved.

The WSUS console still shows the machine as green. From WSUS's point of view nothing happened, and nothing did happen — on WSUS. The device went somewhere else.

The instinct at this point is to start editing Group Policy. Do not. Change one policy value now and you destroy the only evidence that tells you which of your two control planes actually served that update, which means your fix is a guess and you will be back here next month.

The short version

Dual scan is a documented Windows Update client behaviour, not a bug. Point a client at WSUS with Specify intranet Microsoft update service location and also configure either deferral policy, and the client scans both sources while accepting Windows content only from Windows Update. Microsoft's documented way to find out which service a device is really using is the Microsoft.Update.ServiceManager COM object — read the Name and OffersWindowsUpdates of each registered service, not a GUID table you found on a forum. The old DisableDualScan lever is no longer supported on Windows 11, and on Windows 10 combining it with the modern scan source policy means you get nothing from Windows Update at all. The answer in 2026 is the scan source policy family, SetPolicyDrivenUpdateSourceFor<Update Type>, set for all four update classes.

The problem: WSUS says compliant, the device says otherwise

The symptom set is always some combination of the following, and none of them look like the same fault at first glance.

What links them is that the device has two plausible sources of truth for Windows content and you do not currently know which one it used. Until you know that, every change you make is a coin flip.

So three questions, strictly in this order, before you touch a single policy.

  1. Which update services are registered on this device right now, and which one is Automatic Updates actually treating as its default?
  2. Which policy values actually exist in the registry — not which GPOs you believe are linked, and not what the Intune blade says it pushed?
  3. What did the last scan talk to, according to the client's own log?

All three are read-only. Together they take about four minutes on one machine, and they turn a fleet-wide argument into a single sentence you can put in a change record.

Watch out: stopping wuauserv and renaming C:\Windows\SoftwareDistribution is the most common first move in this situation, and it is precisely the move that destroys your evidence. Microsoft documents that the client's local update identifiers live in %WINDIR%\SoftwareDistribution\Datastore\Datastore.edb. Delete that store and you delete the record of which service handed this device each update. Worse, the reflex is usually paired with gpupdate /force and a fresh scan, which appends yet more entries to the trace files in C:\Windows\Logs\WindowsUpdate that you were about to read. Trigger fewer scans, not more, until you have decoded what you already have.

Why it happens: two control planes, one device

The behaviour has a name and it was designed on purpose. Microsoft's WSUS team introduced dual scan in Windows 10 1607 for a specific customer shape: an enterprise that wanted Windows Update to be the primary source for Windows content while WSUS carried everything else — third-party packages, line-of-business applications, other Microsoft products.

Under dual scan the client scans against both WSUS and Windows Update, but it only accepts scan results for Windows content from Windows Update. Anything sitting in the Windows product family on your WSUS server is simply ignored. Microsoft's own framing for why it works that way was the "two masters" problem: if two services can both claim authority over the same update, the client has no way to pick.

That design is defensible. The trouble is how easily you fall into it by accident.

The ingredient list

Dual scan turns itself on when a particular combination of policies is present. Microsoft was explicit that it does not matter whether you set them through Group Policy, through their MDM equivalents, or by writing the underlying registry values directly — all three count.

IngredientPolicy nameUnderlying registry value
The WSUS pointerSpecify intranet Microsoft update service locationWUServer (REG_SZ), WUStatusServer (REG_SZ)
plus either deferralSelect when Preview Builds and Feature Updates are receivedDeferFeatureUpdatesPeriodInDays (0–365)
…or this oneSelect when Quality Updates are receivedDeferQualityUpdatesPeriodInDays (0–30)

Read the third column again, because it is the part that catches experienced people. A GPO you decommissioned two years ago that left values behind in the registry still counts. A task sequence step, an LGPO import baked into your image, a ConfigMgr client setting — all of them write the same values, and the client cannot tell where they came from.

The original trap was almost poetic. Admins who did not want unapproved feature updates arriving from ad hoc scans enabled the feature-update deferral policy to stop them. That worked. It also completed the dual scan ingredient list, which handed Windows content to Windows Update wholesale and took the device out of WSUS's control for exactly the updates the admin cared most about.

Two historical traps that still show up in inherited policy

Context: the vocabulary has moved on and the docs no longer say "Windows Update for Business". Microsoft now calls the same control plane Windows Update client policies; the CSP node is still Update and the registry key is still …\Policies\Microsoft\Windows\WindowsUpdate. The modern scan source policy arrived with the September 1, 2021 preview update KB5005101 (OS builds 19041.1202, 19042.1202 and 19043.1202) and applies to Windows 10 version 2004 and above, and to Windows 11. If you are reading a 2017 blog post about dual scan — and the good ones are all from 2017 — check the date before you copy the remediation.

What the client actually does in 2026

Microsoft's current guidance collapses the whole question down to two inputs: whether a WSUS server is configured, and whether the scan source policy is configured. Everything else is noise. Here is the documented default behaviour.

What is configuredWhere Windows updates come from
No policies at allAll updates come from Windows Update
WSUS server policy only, Windows 10All updates come from WSUS
WSUS server policy only, Windows 11Still WSUS, unless the scan source policy says otherwise
WSUS server policy and deferral policies, Windows 10All updates come from Windows Update, unless you set the scan source policy or disabled dual scan
WSUS server policy and the scan source policyWhatever the scan source policy names, per update class

Row four is the dual scan row, and it is why a device you believe is WSUS-managed can be taking its Windows content from Microsoft with no error anywhere.

Gotcha: the old lever is now a trap. The Do not allow update deferral policies to cause scans against Windows Update policy — the one everybody knows as DisableDualScan — is no longer supported on Windows 11. On Windows 10 it is replaced by the scan source policy and Microsoft explicitly does not recommend using it. And there is a sting: on Windows 10, if you configure both DisableDualScan and the scan source policy, you will not get updates from Windows Update at all. If you inherit a 2018 GPO that sets it, that is a finding to write down, not a fix to keep.

One more documented behaviour explains most surprise-upgrade tickets. If devices are configured for WSUS and you have configured neither a scan source for feature updates nor any offering policy, a user who clicks Check online for updates in Settings may be offered the optional upgrade to Windows 11. Microsoft's recommendation is to configure a scan source or an offering policy to prevent exactly that.

How to verify: name the service before you name the culprit

Everything in this section is read-only. Nothing here changes the device, so you can run it on the affected machine while the incident is still open.

Step 1: ask the agent which services are registered

This is Microsoft's own documented procedure for determining the source of Windows updates on a device, and it is the single most useful thing in this article. The Windows Update Agent keeps a list of registered update services, and it will tell you what they are and which one Automatic Updates has adopted.

PowerShell — real output, lab device, Windows 11 25H2 build 26200.9168
# Read-only. Enumerates registered update services. Changes nothing. PS> $MUSM = New-Object -ComObject "Microsoft.Update.ServiceManager" PS> $MUSM.Services | Select-Object Name,ServiceID,IsDefaultAUService,OffersWindowsUpdates,IsManaged Name : Microsoft Update ServiceID : 7971f918-a847-4430-9279-4a52d1efe18d IsDefaultAUService : True OffersWindowsUpdates : True IsManaged : False Name : DCat Flighting Prod ServiceID : 8b24b027-1dee-babb-9a95-3517dfb9c552 IsDefaultAUService : False OffersWindowsUpdates : True IsManaged : False Name : Windows Store (Prod) ServiceID : 855e8a7c-ecb4-4ca3-b045-1dfa50104289 IsDefaultAUService : False OffersWindowsUpdates : False IsManaged : False Name : Windows Update ServiceID : 9482f4b4-e343-43b6-b170-9a65bc822c77 IsDefaultAUService : False OffersWindowsUpdates : True IsManaged : False # Four services. Note what is NOT here: no "Windows Server Update Service" row. # This device has no WSUS registration at all. That is the whole answer.

Take the fields one at a time, because each one answers a different question.

Name is the human-readable service name, and it is what Microsoft's documentation tells you to read. OffersWindowsUpdates is a boolean saying whether that service offers Windows operating system content as opposed to something else. IsManaged tells you whether the service is a managed service. And IsDefaultAUService — which comes from the second-generation interface, IUpdateService2 — is documented as indicating whether the service is registered with Automatic Updates and is currently the one Automatic Updates uses as its default. That last one is the field people skip and then argue about for an hour.

Microsoft publishes the interpretation table. Here it is, with the meaning of each row.

Name reportedOffersWindowsUpdatesWhat it tells you
Windows Server Update ServiceTrueThe source is a WSUS server. The client is configured to receive updates from WSUS. If this row is missing, no WSUS registration exists on the device, whatever your console shows.
Windows UpdateTrueThe source is Windows Update. The client is configured to receive updates from Windows Update online.
Microsoft UpdateTrueThe source is Microsoft Update, which means updates for other Microsoft products can also arrive, not only the operating system.
DCat Flighting ProdTrueSince Windows 10 version 1709, feature updates are always delivered through the DCAT service. This row indicates the client is configured to receive feature updates from Windows Update.
Windows Store (DCat Prod)FalseInsider updates for Store apps. False means the client is not configured to receive them.

One honest observation from the lab device: the fourth service reports as Windows Store (Prod), not the Windows Store (DCat Prod) that the documentation lists. Service names drift between releases. That is one more reason to read the whole row rather than pattern-matching on one string.

Tip: do not memorise the GUIDs, and be sceptical of the GUID tables that circulate on forums. Only one of these identifiers is published in Microsoft's own documentation: 7971f918-a847-4430-9279-4a52d1efe18d for Microsoft Update, which appears verbatim in the WUA SDK sample that opts a machine in to Microsoft Update. The others in the block above are read from a real device, not from a doc. Resolve GUIDs to names with the ServiceManager output on the machine in front of you — and note that Microsoft's own troubleshooting article deliberately shows the DCAT service ID as a placeholder rather than a real value, which should tell you something about how stable these are.

Step 2: read the policy values that actually exist

Now compare intent against reality. The point of this step is not to confirm your GPO design; it is to find the values nobody remembers writing.

PowerShell — real output, same lab device
# Read-only. What is ACTUALLY in the policy key, not what you think you pushed. PS> Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' TargetReleaseVersion : 1 TargetReleaseVersionInfo : 24H2 # Two values. No WUServer. No UseWUServer. No deferrals. # No SetPolicyDrivenUpdateSourceFor* values either. Cleanly WUfB-managed. PS> $k = Get-Item 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' PS> "AU exists. ValueCount=$($k.ValueCount) SubKeyCount=$($k.SubKeyCount)" AU exists. ValueCount=0 SubKeyCount=0 # The legacy AU container is PRESENT but completely EMPTY. # Test-Path returns True and tells you nothing. Count values, not keys.

Here is the reference table for the values that decide where updates come from. All of these live directly under one key.

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
ValueMeaningWhat to look for
WUServer (REG_SZ)The intranet update service the Automatic Updates client detects and downloads updates from, by HTTP name.Present at all means a WSUS pointer exists. Absent means no WSUS is in play on this device, regardless of what the WSUS console lists.
WUStatusServer (REG_SZ)The server that updated workstations upload statistics to. Can legitimately be the same host as WUServer.A mismatch with WUServer is the usual reason a device patches fine but never reports in.
DoNotConnectToWindowsUpdateInternetLocations (REG_DWORD)1 = Enabled, 0 = Disabled. Stops the client periodically retrieving information from the public Windows Update service.Only applies when the intranet update service policy is set. An explicit 0 is not the same as the value being absent — see the fix section.
DeferFeatureUpdatesPeriodInDays (REG_DWORD)Range 0–365. Days to defer a feature update before offering it.Present alongside WUServer completes the dual scan ingredient list.
DeferQualityUpdatesPeriodInDays (REG_DWORD)Range 0–30. Days to defer a quality update.Same. Either deferral is sufficient on its own.
SetPolicyDrivenUpdateSourceForFeatureUpdates (REG_DWORD)0 = detect, download and deploy feature updates from Windows Update. 1 = from WSUS (default).Absent means you are relying on default behaviour, which differs between Windows 10 and Windows 11.
SetPolicyDrivenUpdateSourceForQualityUpdates (REG_DWORD)Same two values, for quality updates.Set all four or none. A partial set is how you end up with quality updates and feature updates disagreeing about who is in charge.
SetPolicyDrivenUpdateSourceForDriverUpdates (REG_DWORD)Same two values, for driver and firmware updates.Often the first class organisations move to the cloud, and often the one left half-configured.
SetPolicyDrivenUpdateSourceForOtherUpdates (REG_DWORD)Same two values, for updates to other Microsoft products.This is the row that decides whether Office-style content keeps coming from WSUS.
UseUpdateClassPolicySource (REG_DWORD)The companion value Microsoft says you must also configure if you write the scan source values into the registry directly.Missing it means the scan source is silently not altered. The four values above will look correct and do nothing.
TargetReleaseVersion (REG_DWORD)Turns the target feature-update version pin on.1 with no TargetReleaseVersionInfo alongside it pins nothing.
TargetReleaseVersionInfo (REG_SZ)The release the device should move to and stay on until end of service.Compare it against the installed DisplayVersion. They are allowed to disagree, and when they do it means something — see the proof section.

Three more values live one level down, in the legacy Automatic Updates subkey. This is the key that separates a legacy-AU-managed device from a cloud-managed one.

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
ValueMeaningWhat to look for
UseWUServer (REG_DWORD)Set to 1 to configure Automatic Updates to use a Software Update Services server instead of Windows Update.This is the value that actually switches the client to the intranet service. WUServer without UseWUServer is a half-configured device.
NoAutoUpdate (REG_DWORD)0 = Automatic Updates enabled (default), 1 = disabled.Windows Autopatch treats any value here as a conflicting configuration. A device that "never scans" often has this and nothing else wrong.
AUOptions (REG_DWORD)2 = notify for download and install, 3 = auto download and notify for install, 4 = auto download and schedule install, 7 = notify for install and notify for restart (Server 2016+).Confirms which install behaviour is actually in force, which matters when you are arguing about whether a user could have triggered the install.

Step 3: decode the log and read the ServiceID

The client keeps its diagnostics as Event Tracing for Windows trace files, not as a text log. Microsoft documents windowsupdate.log as living in C:\Windows\Logs\WindowsUpdate, and Get-WindowsUpdateLog as the way to merge and convert those .etl files into one readable file. Note the documented caveat: the cmdlet produces a static snapshot, so it does not keep updating the way the old text log did. Run it again for fresh data.

PowerShell — decode, then filter for the source. Line shapes from Microsoft's documented examples.
# Convert the ETL set to a readable log. Read-only against the traces. PS> Get-WindowsUpdateLog -LogPath "$env:TEMP\WindowsUpdate.log" # The two lines that answer "which source?" - the ServiceID of the search, # and the endpoint the agent resolved for it. PS> Select-String -Path "$env:TEMP\WindowsUpdate.log" -Pattern 'ServiceID|redir Client/Server URL|SyncUpdates round trips' # Shape of a scan record, per Microsoft's documented log excerpts: Agent * START * Finding updates CallerId = Update;taskhostw Id = 25 Agent * Online = Yes; Interactive = No; AllowCachedResults = No Agent * ServiceID = {9482f4b4-e343-43b6-b170-9a65bc822c77} Agent * Search Scope = {Machine} Misc Got 9482f4b4-e343-43b6-b170-9a65bc822c77 redir Client/Server URL: https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx PT + SyncUpdates round trips: 2 Agent * Found 4 updates and 83 categories in search Agent * END * Finding updates CallerId = Update;taskhostw Id = 25 # fe3.delivery.mp.microsoft.com = Microsoft. On a WSUS scan this resolves to # your own intranet host, on port 8530 (HTTP) or 8531 (HTTPS) by default.

Two things to pull out of that. The ServiceID on the Agent line is the identifier of the service that search ran against — match it back to the Name you resolved in Step 1, do not translate it from memory. The redir Client/Server URL on the Misc line is the endpoint the agent actually resolved, and it is the least ambiguous line in the entire file. If a device you believe is WSUS-managed shows a delivery.mp.microsoft.com endpoint for a Windows content search, you have your answer and you did not have to change anything to get it.

It is worth knowing which component names to filter on, because the file is enormous. Microsoft documents ProtocolTalker as client-server sync, DownloadManager as the component that creates and monitors payload downloads, DataStore as the local update cache, Handler and Setup as the installer handlers, and EEHandler as applicability rule evaluation. For a source question you want Agent, Misc and PT. Everything else is noise on this particular hunt.

Step 4: corroborate with the event log

The log tells you what the client intended. The event log gives you timestamps you can put in a ticket and correlate against your WSUS approval history. One channel carries the useful entries.

Microsoft-Windows-WindowsUpdateClient/Operational
Event IDMessageWhat it tells you
26Windows Update successfully found N updatesA scan completed and found something. Take the timestamp and go find the ServiceID line nearest to it in the decoded log — that pairing is your proof of source.
41An update was downloadedContent was actually fetched. If the count or the timing does not line up with your WSUS approvals, the source was not WSUS.

One channel across: the Setup log carries Event 2, which reports that a package was successfully changed to the Staged state and names the KB. That is your bridge from "a scan happened" to "this specific KB was staged on this device", which is how you answer the question your change board will actually ask.

PowerShell — correlating a scan with what got staged
# Read-only. Event IDs below were observed on the lab device. PS> Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 40 | >> Where-Object Id -in 26,41 | >> Select-Object TimeCreated,Id,@{n='Msg';e={$_.Message.Split([char]10)[0]}} TimeCreated Id Msg ----------- -- --- 20/08/2026 06:12:44 41 An update was downloaded. 20/08/2026 06:11:03 26 Windows Update successfully found 4 updates. # Then bridge to what the servicing stack actually staged: PS> Get-WinEvent -LogName Setup -MaxEvents 20 | Where-Object Id -eq 2 | >> Select-Object -First 3 TimeCreated,Id,Message TimeCreated Id Message ----------- -- ------- 20/08/2026 06:31:09 2 Package KB5121003 was successfully changed to the Staged state. 20/08/2026 06:30:52 2 Package KB5120708 was successfully changed to the Staged state. 19/08/2026 04:52:17 2 Package KB5123304 was successfully changed to the Staged state. # Now you can say: scan at 06:11 against service X produced KB5121003 at 06:31.

Step 5: the decision path

Follow this in order and you will land on a named root cause rather than a hunch.

  1. Is there a Windows Server Update Service row in Step 1? If no, no WSUS registration exists on this device. Stop looking for dual scan — your problem is an offering, deferral or target-version policy, or a genuinely unmanaged device. If yes, continue.
  2. Is WUServer present, and is UseWUServer set to 1 in the AU subkey? A WUServer value with no UseWUServer is a half-applied policy, and it is a common outcome when a GPO was scoped wrongly or a task sequence step half-ran.
  3. Are either DeferFeatureUpdatesPeriodInDays or DeferQualityUpdatesPeriodInDays present alongside it? If yes, the dual scan ingredient list is complete. On Windows 10 with no scan source policy, expect Windows content to come from Windows Update. That is the documented behaviour, not a fault.
  4. Is any SetPolicyDrivenUpdateSourceFor* value present? If some are and some are not, you have a per-class split and you should expect exactly the inconsistency you are seeing. If they were written straight into the registry and UseUpdateClassPolicySource is missing, the scan source was never altered at all.
  5. Is DisableDualScan present? On Windows 11 it does nothing. On Windows 10 alongside the scan source policy it stops Windows Update content entirely, which presents as "no updates found" rather than "wrong source".
  6. Which ServiceID did the last scan actually use? This is the answer. Steps 1 to 5 are the explanation for it. Write both down before you change anything.

The fix: decide who owns Windows updates, then say it out loud

The fix is not a registry tweak. It is a decision, followed by expressing that decision unambiguously so the client never has to guess.

1. Decide per update class, not per device. There are four classes: feature updates, Windows quality updates, driver and firmware updates, and updates for other Microsoft products. Microsoft's guidance is explicit that only two things determine where updates come from — the scan source policy, and whether a WSUS server is configured. Decide each class once, write it down, and stop configuring anything else that touches the question.

2. Express it with the scan source policy. In Group Policy it is Specify source service for specific classes of Windows Updates, under Computer Configuration \ Administrative Templates \ Windows Components \ Windows Update \ Manage updates offered from Windows Server Update Service. By CSP it is the Update/SetPolicyDrivenUpdateSourceFor<Update Type> family, and Microsoft says to configure all of them if you go the CSP route. 0 means take that class from Windows Update, 1 means take it from WSUS.

3. If you insist on the registry, set the companion value. Microsoft says editing the registry to change update policy behaviour is not recommended and you should use Group Policy or the CSP. If you do it anyway, you must also configure UseUpdateClassPolicySource, or the scan source will not be altered.

4. Retire DisableDualScan. Not "set it to 0" — remove it, by setting the policy to Not Configured. It is unsupported on Windows 11 and counter-recommended on Windows 10.

5. Leave DoNotConnectToWindowsUpdateInternetLocations alone unless you actively want it. This one has a genuine trap in it, described below.

PowerShell — what a deliberate, per-class configuration looks like when you verify it
# AFTER the policy applies. This is verification, not configuration - # set these through Group Policy or the Update CSP, not by writing keys. PS> Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' | >> Select-Object WUServer, UseUpdateClassPolicySource, >> SetPolicyDrivenUpdateSourceForFeatureUpdates, >> SetPolicyDrivenUpdateSourceForQualityUpdates, >> SetPolicyDrivenUpdateSourceForDriverUpdates, >> SetPolicyDrivenUpdateSourceForOtherUpdates WUServer : http://wsus.contoso.com:8530 UseUpdateClassPolicySource : 1 SetPolicyDrivenUpdateSourceForFeatureUpdates : 1 # feature -> WSUS SetPolicyDrivenUpdateSourceForQualityUpdates : 1 # quality -> WSUS SetPolicyDrivenUpdateSourceForDriverUpdates : 0 # drivers -> Windows Update SetPolicyDrivenUpdateSourceForOtherUpdates : 1 # other MS -> WSUS # All four present, companion value present, and no deferral values in sight. # The client no longer has to infer anything. Re-run Step 1 to confirm.
Gotcha: 0 is not neutral. For DoNotConnectToWindowsUpdateInternetLocations, Microsoft documents 1 as Enabled and 0 as Disabled — and separately documents that when the value is set to 0, the Check online for updates from Microsoft Update option is hidden on Windows 11 version 24H2. That is a real support case: a Configuration Manager task sequence enables the policy before an upgrade and disables it afterwards, leaving a 0 behind, and the link disappears. The documented resolution is to set the policy to Not Configured, which removes the value entirely. Explicitly-Disabled and Not-Configured are different states throughout this policy family. Treat "set it to zero" as a change, never as a cleanup.
Gotcha: an empty key proves nothing. On the lab device the legacy …\WindowsUpdate\AU subkey exists — but with zero values and zero subkeys, and with no WUServer or UseWUServer anywhere. A Test-Path check returns True and tells you the opposite of the truth. Retired GPOs, LGPO imports baked into an image and task sequence steps all leave empty containers behind. Count values, not keys: (Get-Item <path>).ValueCount is the check that means something.

Finally, there is a published list of the values Microsoft itself treats as disqualifying. Windows Autopatch inspects three during readiness checks: DoNotConnectToWindowsUpdateInternetLocations and DisableWindowsUpdateAccess under the WindowsUpdate policy key, and NoAutoUpdate under the AU subkey. Any value at all in those three marks a device Not ready. Microsoft also names the four usual sources when a removed value keeps coming back: Active Directory Group Policy, Configuration Manager device client settings, manual registry edits, and local Group Policy applied during imaging. If your remediation keeps getting reverted, that list is where to look next.

Proof it worked: what a single-source device looks like

Here is the reference case, read from a real corporate Windows 11 device with nothing changed on it. Use it as the shape you are aiming for: one control plane, unambiguously.

The device is Windows 11 Enterprise, DisplayVersion 25H2, build 26200.9168, with servicing stack 10.0.26100.9156 — a 26100 stack on a 26200 build, which is normal. The Windows Update Agent binaries are all at 1509.2607.1012.0.

Its evidence set reads as follows. The ServiceManager enumeration returns four services and no Windows Server Update Service row, so there is no WSUS registration to argue about. Microsoft Update is the one with IsDefaultAUService True, so that is what Automatic Updates uses. The policy key holds exactly two values, TargetReleaseVersion and TargetReleaseVersionInfo. There is no WUServer, no UseWUServer, no deferral value and no scan source value. The AU subkey is present and empty.

That is a cleanly cloud-managed client. Dual scan cannot occur on it, because the WSUS half of the ingredient list does not exist.

Context: one honest wrinkle in that baseline, because it is the kind of thing that gets misread in a handover. The policy pins TargetReleaseVersionInfo to 24H2, but the installed DisplayVersion is 25H2. The device is running a later release than the one it is pinned to — the pin has been overtaken. Do not describe this machine as "pinned to and sitting on 24H2"; that is not what the data says. An overtaken pin offers nothing and holds nothing back, and it deserves its own ticket. While you are in there: the ProductName registry value on this Windows 11 device reads "Windows 10 Enterprise". Any script that detects Windows 11 by reading ProductName fails silently. Use CurrentBuild (22000 or higher) or DisplayVersion.

The binaries worth knowing by name

When you are reading a decoded update log at two in the morning, these are the files behind the components you are filtering on. Paths and versions read from the lab device.

FileWhat it doesWhere it lives, and its version here
wuapi.dllWindows Update Client API. Implements the WUA COM interfaces — including IUpdateService and IUpdateService2, the ones whose properties you read in Step 1. Microsoft.Update.ServiceManager is a front end for this DLL, which is why Step 1 is authoritative rather than inferred.C:\Windows\System32\wuapi.dll, 1509.2607.1012.0
wuaueng.dllWindows Update Agent — the engine, and the ServiceDll that the wuauserv service loads. Microsoft documents that the installed WUA version is the version of this file in System32, so this is the number to quote when you are comparing agents across a fleet.C:\Windows\System32\wuaueng.dll, 1509.2607.1012.0
UsoClient.exeThe Update Session Orchestrator client. Microsoft's own dual scan guidance used UsoClient.exe startscan to force a scan after a policy change, which is still the quickest way to produce exactly one new log record to read.C:\Windows\System32\UsoClient.exe, 10.0.26100.8328
wuauclt.exeThe legacy Windows Update client executable. Still shipped, still versioned with the agent rather than with the OS.C:\Windows\System32\wuauclt.exe, 1509.2607.1012.0

Notice the version split: the three agent binaries share 1509.2607.1012.0 while UsoClient.exe reports 10.0.26100.8328. The Windows Update Agent and the Update Session Orchestrator are versioned on different trains. If you are diffing "the update stack" across machines, you need both numbers, not one.

What to re-check after you change the policy, and in what order

  1. Re-run Step 1. The registered service list is what should change first, and if it does not, your policy did not apply.
  2. Re-read the policy key. Confirm the values you intended are there and the ones you retired are gone, not zeroed.
  3. Force exactly one scan. One, so there is one record to read.
  4. Decode the log once and check the ServiceID and the resolved endpoint on that single scan.
  5. Check Event 26 for the scan and Event 41 for any download, and note the timestamps.
  6. Only now open the WSUS console. It is the last place to look, because it can only ever tell you what WSUS thinks.
Tip: capture a baseline before you need one. The ServiceManager output and a dump of the WindowsUpdate policy key, taken from one known-good device in each management model you run, is perhaps thirty lines of text. That before-and-after pair is the difference between a four-minute diagnosis and a two-day argument with three teams about whose policy did it. Store it with your build documentation, not in a ticket.

References

Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Windows Update
Your Windows Update config reverted itself: WaaSMedicSvc,…
You disabled wuauserv and it came back; sc config on WaaSMedicSvc is denied even as…
Windows Update
One read-only PowerShell collector for Windows patching failures…
Test-Path and value checks return confidently wrong patching verdicts on real devices.…
Windows Update
Which Update Service Is This Device Actually Registered Against?…
Before troubleshooting why a device gets the wrong updates, enumerate the registered…