HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Update Windows UpdateUSOUsoSvcusoclientEvent ViewerETWScheduled TasksTroubleshooting

wuauclt /detectnow Does Nothing: Diagnosing Patching Through the Update Session Orchestrator

IA
Imran Awan
23 August 2026

Somebody on the bridge call says the machine has not scanned for updates in three weeks. Somebody else opens an elevated prompt, types wuauclt /detectnow, gets no output at all, and says "right, I have kicked it, give it ten minutes". Ten minutes later nothing has changed, because nothing ever happened.

That command has done nothing on any supported build of Windows for years. It does not error. It does not warn. It returns to the prompt instantly and silently, which is exactly why the myth survives: silence looks like success.

The short version

Microsoft's own archived guidance states plainly that "administrators trying to use wuauclt /detectnow will notice that it doesn't do anything". The scan, download, install and commit sequence is now driven by the Update Session Orchestrator - the UsoSvc service, running as svchost.exe -k netsvcs with usosvc.dll, executing work through MoUsoCoreWorker.exe. On the lab device that worker is not in System32: it lives in C:\Windows\UUS\amd64 at version 1509.2607.1012.0, a version line completely separate from the 10.0.26200.9168 OS. There is no usocore.dll anywhere on the device. USO does not write to a browsable Event Viewer channel at all - it writes ETW to UpdateSessionOrchestration.etl, while the Events 26 and 41 everybody quotes are emitted by the Windows Update agent, wuaueng.dll. And usoclient.exe has no documented command line: Microsoft calls it "an internal command line".

The problem: the command returns instantly and nothing scans

The reason this particular piece of folklore is so durable is that the binary is still there. wuauclt.exe has not been deleted from Windows. It sits in System32 exactly where it has since Windows XP.

So when you type wuauclt /detectnow you do not get "command not found". You do not get a usage message. You get a clean, instant return - the shape of a command that worked.

The binary that is still there - Windows 11 25H2, build 26200.9168
# The file exists, so nothing complains. PS> (Get-Item C:\Windows\System32\wuauclt.exe).VersionInfo | >> Select FileDescription, FileVersion FileDescription FileVersion --------------- ----------- Windows Update 1509.2607.1012.0 # And this is the whole of the "output" from the command everybody trusts. PS> wuauclt /detectnow PS> # No error. No text. No scan. The prompt just comes back.

Note the version string on that binary: 1509.2607.1012.0. That is not an OS build number, and it matters later.

Microsoft has said this out loud. An archived Microsoft blog post covering Windows 10 and Windows Server 2016 states it in one sentence: "Administrators trying to use wuauclt /detectnow will notice that it doesn't do anything."

So the immediate operational damage is not that a scan failed. It is that somebody recorded "scan triggered, no updates found" in a ticket, and the device stays unpatched behind a note that says it was checked.

Before touching a single command on a device that is allegedly not scanning, three questions need answers.

  1. Which component is actually supposed to start a scan on a modern build, and is it running?
  2. Where does that component log, given that it does not appear in Event Viewer under any obvious name?
  3. When Event 26 says "successfully found N updates", which binary emitted that, and does it prove the orchestrator did its job?

Why it happens: USO owns the workflow, and System32 only holds the front door

Microsoft's own description of the Windows Update workflow is built around a component it calls the Orchestrator, and the phrasing is unambiguous about who is in charge.

The documented sequence has four phases, and the Orchestrator initiates every one of them: it "schedules the scan", it "starts downloads", it "starts the installation", and it "starts a restart". The Windows Update client and the arbiter do the work underneath.

That is the mental model to hold. The Windows Update agent is a worker with an API. The Update Session Orchestrator is the thing that decides when the worker runs and drives it through the phases in order. wuauclt.exe was a front end for the worker, from an era when the worker scheduled itself.

This is why the failure modes changed shape. Microsoft's own log documentation lists exactly when to reach for the orchestrator trace, and every entry is a phase-transition failure: "updates are available but download isn't getting triggered", "updates are downloaded but installation isn't triggered", "updates are installed but reboot isn't triggered".

Read those three lines again, because they are the single most useful diagnostic sentence Microsoft publishes about USO. A device stuck between phases is an orchestration problem. A device that errors inside a phase is an agent or servicing-stack problem. Those are different investigations.

The part that breaks detection scripts: System32 is mostly stubs now

Here is where a lot of home-grown health checks quietly go wrong. If you assume the USO binaries live in System32 like a normal Windows component, you will get some right and some very wrong.

On the lab device the USO files in System32 carry OS-line version numbers in the 10.0.26100.x range. The actual working implementation is somewhere else entirely, in C:\Windows\UUS\amd64, on a completely different version line.

Two inventories, two version lines - read-only, verified
# 1. What is actually in System32 with a "uso" name. PS> Get-ChildItem C:\Windows\System32\uso* -File | >> ForEach-Object { '{0,-16} {1,-28} {2}' -f $_.Name, >> $_.VersionInfo.FileVersion, $_.VersionInfo.FileDescription } usoapi.dll 10.0.26100.8521 (WinBuild) Update Session Orchestrator API UsoClient.exe 10.0.26100.8328 (WinBuild) UsoClient usocoreps.dll 10.0.26100.7705 (WinBuild) USO Core Worker Proxy Stub usodocked.dll 10.0.26100.8972 (WinBuild) Uso Docked DLL usosvc.dll 10.0.26100.8737 (WinBuild) Update Session Orchestrator Service # 2. The name everyone writes in blog posts and detection scripts. PS> 'System32','SysWOW64','UUS\amd64' | ForEach-Object { >> '{0,-10} {1}' -f $_, (Test-Path "C:\Windows\$_\usocore.dll") } System32 False SysWOW64 False UUS\amd64 False # usocore.dll does not exist on this device. Not anywhere. # 3. Where the real worker lives. PS> Get-ChildItem C:\Windows\UUS\amd64 -File | >> Where-Object Name -match 'Uso|wuau|MoNotif' | >> ForEach-Object { '{0,-24} {1}' -f $_.Name, $_.VersionInfo.FileVersion } MoNotificationUx.exe 1509.2607.1012.0 MoUsoCoreWorker.exe 1509.2607.1012.0 UsoClientImpl.dll 1509.2607.1012.0 usosvcimpl.dll 1509.2607.1012.0 wuaucltcore.exe 1509.2607.1012.0 wuauengcore.dll 1509.2607.1012.0 # OS build is 10.0.26200.9168. The update stack is on 1509.2607.1012.0.

The pattern is consistent once you see it. System32 holds the entry point that the OS ships and versions with the OS. C:\Windows\UUS\amd64 holds the implementation, and it is versioned on its own line because it is serviced on its own schedule.

You can see the same shape in the naming: UsoClient.exe in System32 against UsoClientImpl.dll in UUS, and usosvc.dll in System32 against usosvcimpl.dll in UUS. Stub in front, implementation behind.

Context. UUS is the Unified Update Stack directory. The point of it is that the machinery which finds and installs updates can itself be updated without waiting for a new OS build - which is why MoUsoCoreWorker.exe and wuaueng.dll both read 1509.2607.1012.0 on a device whose OS is 10.0.26200.9168. The same device runs a 10.0.26100.9156 servicing stack on a 26200 build. Three independent version lines on one machine is normal now, and "the version does not match the build" is not by itself a finding.
Gotcha. A detection script that does Test-Path C:\Windows\System32\usocore.dll and reports "USO components missing" will flag every healthy device in your fleet. That file does not exist and, as far as I can establish, never has under that name. The same trap catches MoUsoCoreWorker.exe: it is genuinely not in System32, so a System32-only check marks a perfectly healthy orchestrator as broken. Before you ship a file-presence check, enumerate the directory on a known-good device and key the check on what is actually there.

Binary reference: what each file is and where it really is

FileWhere it really livesRole, and version on the lab device
usosvc.dllC:\Windows\System32The ServiceDll that UsoSvc loads into a shared svchost.exe. Description string reads "Update Session Orchestrator Service". 10.0.26100.8737.
usosvcimpl.dllC:\Windows\UUS\amd64The UUS-side service implementation behind that stub. 1509.2607.1012.0.
usoapi.dllC:\Windows\System32"Update Session Orchestrator API" - the surface other components call to request update work. 10.0.26100.8521.
usocoreps.dllC:\Windows\System32"USO Core Worker Proxy Stub" - COM marshalling between callers and the core worker. 10.0.26100.7705.
usodocked.dllC:\Windows\System32"Uso Docked DLL". 10.0.26100.8972.
UsoClient.exeC:\Windows\System32The command-line front end that Microsoft's own scheduled tasks invoke. 10.0.26100.8328.
UsoClientImpl.dllC:\Windows\UUS\amd64The implementation behind UsoClient.exe. 1509.2607.1012.0.
MoUsoCoreWorker.exeC:\Windows\UUS\amd64"MoUSO Core Worker Process" - the process that actually runs an update session. Not in System32. 1509.2607.1012.0.
wuaueng.dllC:\Windows\System32The Windows Update agent. Also the registered message and resource file for the Microsoft-Windows-WindowsUpdateClient event provider - so it is what emits Events 25, 26, 31 and 41. 1509.2607.1012.0.
wuauclt.exeC:\Windows\System32The legacy agent front end. Still shipped, still runs, switches no longer do the job. 1509.2607.1012.0.
usocore.dllDoes not exist. Widely cited, not present in System32, SysWOW64 or UUS on this build.

How to verify: service, tasks, trace session, events - in that order

This is a read-only sequence. Every step below observes state without changing it, and the order matters: each step tells you whether the next one is even worth running.

Watch out. Do not stop wuauserv and rename SoftwareDistribution first. That is the reflex, and on an orchestration fault it is actively counterproductive: it discards the datastore that records what was found and when, forces a full rather than delta scan, and leaves you unable to answer the one question that mattered - whether the orchestrator ever asked for a scan at all. The USO trace files and the task history survive that reset, but the agent-side evidence you would have correlated them against does not.

Step 1. Confirm the orchestrator service is running and correctly configured. If UsoSvc is disabled or its ServiceDll has been tampered with by a "debloat" script, nothing downstream is worth checking.

HKLM\SYSTEM\CurrentControlSet\Services\UsoSvc
ValueMeaningWhat to look for
StartService start type as a number.2 = Automatic, which is correct and is what the lab device shows. 4 means someone disabled it - the single most common cause of "this device never scans".
TypeService type flags.32 (0x20) = runs in a shared process. Expected. It does not get its own svchost.
ImagePathThe host process and its service group.C:\WINDOWS\system32\svchost.exe -k netsvcs -p. Anything else - especially a path outside System32 - is a red flag, not a tuning choice.
ObjectNameThe account the service runs as.LocalSystem. USO drives installation, so it needs it.
Parameters\ServiceDllThe DLL svchost loads for this service.C:\WINDOWS\system32\usosvc.dll. This is the value to check when the service exists but refuses to start.
DescriptionIndirect string reference for the display text.@%systemroot%\system32\usosvc.dll,-102 - note it points back at usosvc.dll, confirming which binary owns the service.
Step 1 - UsoSvc state and configuration (read-only)
PS> Get-Service UsoSvc | Select Name, DisplayName, Status, StartType Name DisplayName Status StartType ---- ----------- ------ --------- UsoSvc Update Orchestrator Service Running Automatic PS> Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\UsoSvc' | >> Select ImagePath, ObjectName, Start, Type ImagePath : C:\WINDOWS\system32\svchost.exe -k netsvcs -p ObjectName : LocalSystem Start : 2 Type : 32 PS> (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\UsoSvc\Parameters').ServiceDll C:\WINDOWS\system32\usosvc.dll # Running / Automatic / LocalSystem, ServiceDll intact. Orchestrator is healthy.

Step 2. Read the scheduled tasks - and read the verbs off them. This is the highest-value step in the whole exercise, and almost nobody does it.

Windows ships the orchestrator's triggers as scheduled tasks under \Microsoft\Windows\UpdateOrchestrator\. Their actions are first-party: Microsoft wrote those command lines, so the verbs in them are not internet folklore.

Step 2 - what Microsoft's own tasks actually run
PS> Get-ScheduledTask -TaskPath '\Microsoft\Windows\UpdateOrchestrator\*' | >> ForEach-Object { $n=$_.TaskName; $s=$_.State >> $_.Actions | ForEach-Object { >> '{0,-34} {1,-9} {2} {3}' -f $n,$s,(Split-Path $_.Execute -Leaf),$_.Arguments } } Report policies Ready usoclient.exe ReportPolicies Schedule Maintenance Work Disabled usoclient.exe StartMaintenanceWork Schedule Scan Ready usoclient.exe StartScan Schedule Scan Static Task Ready usoclient.exe StartScan Schedule Wake To Work Disabled usoclient.exe StartWork Schedule Work Disabled usoclient.exe StartWork Start Oobe Expedite Work Ready usoclient.exe StartWork StartOobeAppsScanAfterUpdate Ready usoclient.exe StartOobeAppsScanAfterUpdate StartOobeAppsScan_LicenseAccepted Ready usoclient.exe StartOobeAppsScan UIEOrchestrator Ready UIEOrchestratorStub.exe /SendHeartbeat USO_UxBroker Ready MusNotification.exe UUS Failover Task Ready MLEngineStub.exe HandleUusFailoverEvaluation... # Six distinct usoclient verbs, straight from Microsoft's shipped task definitions. # Note the two Disabled "Work" tasks - that is a policy-managed device, not a fault.

Two things to take from that output. First, Schedule Scan being Ready with a populated next-run time is your evidence that scans are scheduled at all. A disabled or deleted Schedule Scan is a root cause, and it is a common casualty of update-blocking utilities.

Second, the Disabled state on the three "Work" tasks is not damage. On a WUfB-managed device that is the expected shape, and treating it as a fault sends you off repairing something that was never broken.

Step 3. Confirm the orchestrator's trace session is live. USO does not log where you expect, so verify the session exists before you go looking for files.

Step 3 - the UpdateSessionOrchestration ETW session, live
PS> logman query -ets | Select-String 'Update|Uso' WindowsUpdate_trace_log Trace Running UpdateSessionOrchestration Trace Running PS> logman query 'UpdateSessionOrchestration' -ets Name: UpdateSessionOrchestration Status: Running Root Path: C:\ProgramData\USOShared\Logs\System Segment Max Size: 1300 MB Output Location: C:\ProgramData\USOShared\Logs\System\ UpdateSessionOrchestration.8a2b5a08-...-aa0e58385d3b.1.etl Buffer Size: 64 Buffers Lost: 0 Buffers Written: 11 Clock Type: System Provider: Provider Guid: {6F697AEA-5499-5C54-AE6E-E1489D0A252F} Level: 5 KeywordsAny: 0xffffffffffffffff # Buffers Lost: 0 means the trace is healthy - you are not missing events.

Step 4. Find the ETL files on disk. Microsoft documents these as UpdateSessionOrchestration.etl in C:\ProgramData\USOShared\Logs. On this 25H2 device they are one level deeper, and the file names carry a session GUID and sequence number.

Step 4 - the real on-disk layout, documented path versus actual
PS> Get-ChildItem 'C:\ProgramData\USOShared\Logs' -File # Nothing. The documented folder holds only subdirectories on this build. PS> Get-ChildItem 'C:\ProgramData\USOShared\Logs' -Directory | Select Name System User PS> Get-ChildItem 'C:\ProgramData\USOShared\Logs\System' | >> Sort LastWriteTime -Desc | Select -First 4 Name, Length, LastWriteTime Name Length LastWriteTime ---- ------ ------------- MoUxCoreWorker.b03aa298-....1.etl 65536 8/23/2026 10:29:03 UpdateSessionOrchestration.8a2b5a08-....1.etl 65536 8/23/2026 10:29:03 UpdateSessionOrchestration.3e05f63e-....3.etl 1048576 8/22/2026 18:51:15 MoUxCoreWorker.01ac903f-....1.etl 1310720 8/22/2026 18:51:15 # Logs\System = machine-wide orchestration. Logs\User = per-user update UX.

Those are binary ETL files, not text. To read them, use Get-WindowsUpdateLog, which merges and converts the trace files into a single readable log. It produces a static snapshot - it does not keep updating, so re-run it each time you want current data.

Tip. Collect C:\ProgramData\USOShared\Logs\System and the UpdateOrchestrator task history before you attempt any remediation, and collect them as a pair. The task history tells you when the orchestrator was asked to do something; the ETL tells you what it did about it. Either one alone leaves the argument unresolved, and any reset you run afterwards makes the pairing impossible to reconstruct.

Step 5. Now look at the event channel - and be precise about what it proves. There is no USO channel in Event Viewer. On the lab device, filtering every registered channel for a USO-related name returns only the Windows Update client channels.

Microsoft-Windows-WindowsUpdateClient/Operational
Event IDMessageWhat it tells you
25"Windows Update failed to check for updates with error 0x80240438."A scan was attempted and failed. Observed 20 times on the lab device. Note that 0x80240438 is not listed in Microsoft's published Windows Update error reference, so resist decoding it from a blog - go to the ETL.
26"Windows Update successfully found N updates."The agent completed a scan against one update source. The richest event in the channel: its data carries both updateCount and a serviceGuid. Observed 477 times.
31"Windows Update failed to download an update."Phase-level download failure. Rare here - only 2 occurrences - which is what makes the pair with Event 41 meaningful.
41"An update was downloaded."Something downloaded. Not necessarily a cumulative update - see below. Carries updateTitle, updateGuid and updateRevisionNumber. Observed 101 times.

Now the part that settles the question in the title. Ask Windows which binary registers that provider.

Step 5 - who actually emits Events 26 and 41
PS> wevtutil gp 'Microsoft-Windows-WindowsUpdateClient' name: Microsoft-Windows-WindowsUpdateClient guid: 945a8954-c147-4acd-923f-40c45405a658 resourceFileName: %systemroot%\system32\wuaueng.dll parameterFileName: %systemroot%\system32\wuaueng.dll messageFileName: %systemroot%\system32\wuaueng.dll # The provider is owned by wuaueng.dll - the Windows Update AGENT. # Not usosvc.dll. Not MoUsoCoreWorker.exe. The orchestrator writes ETW instead. PS> $e = Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' | >> Where-Object Id -eq 26 | Select-Object -First 1 PS> $e.ToXml() <Event><System> <Provider Name='Microsoft-Windows-WindowsUpdateClient' Guid='{945a8954-c147-4acd-923f-40c45405a658}'/> <EventID>26</EventID> <TimeCreated SystemTime='2026-08-23T09:42:29.7739159Z'/> <Execution ProcessID='18168' ThreadID='18588'/> <Security UserID='S-1-5-18'/> </System><EventData> <Data Name='updateCount'>0</Data> <Data Name='serviceGuid'>{8b24b027-1dee-babb-9a95-3517dfb9c552}</Data> </EventData></Event> # That serviceGuid is documented by Microsoft: 8B24B027... = OS Flighting.

So Event 26 is emitted by the agent, and its serviceGuid tells you which update source was scanned. Microsoft publishes that mapping: 9482F4B4-... is Windows Update, 7971f918-... is Microsoft Update, 855E8A7C-... is the Store, 3DA21691-... is WSUS or Configuration Manager, and 8B24B027-... is OS Flighting.

The documentation attaches a warning to that table which is worth repeating: the ServiceId "identifies a client abstraction, not any specific service in the cloud", so do not infer a particular server from it.

Event 41 rewards the same scepticism. On the lab device the most recent one reads updateTitle = 9PKDZBMV1H3T-Microsoft.GetHelp. That is a Microsoft Store app, not a cumulative update. "An update was downloaded" had nothing to do with patching the OS.

Step 6. Decide which investigation you are in. With the above in hand the branch is clean. If UsoSvc is stopped or Schedule Scan is gone, you have an orchestration fault and the fix is the service or the task. If both are healthy and Event 26 is landing regularly, the orchestrator is doing its job and any complaint about missing patches is an approval, targeting or applicability question - not a client fault at all.

The fix: trigger a scan the way Windows itself does

Now, and only now, the command. The replacement for wuauclt /detectnow is documented by Microsoft in exactly one place I can find, in that same archived post: "In Windows 10, and Windows Server 2016 or newer, the command to scan Windows Update from the command line is: c:\windows\system32\UsoClient.exe startscan".

That is worth taking seriously precisely because it is corroborated on the device itself. StartScan is the argument in Microsoft's own Schedule Scan task. It is not an internet guess.

Everything else circulating about usoclient.exe deserves a much colder eye, because Microsoft's position on the tool is explicit. Asked directly for documentation in 2018, Microsoft's response was: "Usoclient.exe is an internal command line, so there is no official article or /? /help about it."

There is no /?. There is no reference page. The widely-copied verb lists trace back to community forum threads citing third-party blogs - and if you follow the citation chain in that same Microsoft thread, that is exactly where the extended list came from.

Documented, shipped, or folklore - the honest split

VerbEvidence statusWhat that means for you
StartScanBoth. Named in Microsoft's archived guidance and used by the shipped Schedule Scan task.The safest of the set. Still an internal CLI, but you can point at first-party evidence.
StartWork, StartMaintenanceWork, ReportPolicies, StartOobeAppsScan, StartOobeAppsScanAfterUpdateShipped, undocumented. Present in Microsoft's own UpdateOrchestrator task actions on this device.First-party evidence that they exist and what triggers them. No documented semantics, no stability guarantee.
StartDownload, StartInstall, ScanInstallWait, RefreshSettings, StartInteractiveScan, RestartDevice, ResumeUpdateCommunity-discovered. Undocumented and unsupported. Not in any shipped task on this device and not in any Microsoft reference.Do not build fleet automation on these. Behaviour has changed between builds before, silently.

There is a further catch that the forum threads report and that the task definitions corroborate: these verbs were designed to be invoked by the OS, in specific contexts. The shipped tasks run as SYSTEM with a ServiceAccount logon and a Limited run level. Typing the same verb into an interactive elevated prompt is not the same call, and reports of verbs "doing nothing" outside a user session are consistent with that.

So if you need a scan trigger you can actually depend on across builds, prefer an interface Microsoft supports:

  1. Run the shipped task itself rather than the raw binary - Start-ScheduledTask -TaskPath '\Microsoft\Windows\UpdateOrchestrator\' -TaskName 'Schedule Scan'. You get Microsoft's own invocation context, and the task's LastTaskResult gives you a return code to check.
  2. Drive the Windows Update Agent COM API (or a wrapper module around it) when you need a scan result programmatically. It is a documented API surface with real error codes, and it emits Event 26 like any other caller.
  3. Use your management plane - Windows Update for Business policy, or an Intune remediation - when the goal is fleet behaviour rather than one-off diagnosis.
  4. Leave the UI as the tiebreaker. If Settings finds updates and your script does not, the fault is in your trigger, not the device.

And if the real finding was step 1 - UsoSvc disabled by a debloat script - then the fix is to restore the start type to 2 and the ServiceDll to usosvc.dll, not to reset the update stack.

Proof it worked: correlating a task run with Event 26

The verification that a scan actually happened does not come from the absence of an error message. It comes from two independent records agreeing on a timeline.

Proof - orchestrator task run against agent events, same device, same morning
# A. What the orchestrator says it did. PS> Get-ScheduledTaskInfo -TaskPath '\Microsoft\Windows\UpdateOrchestrator\' ` >> -TaskName 'Schedule Scan' | Select LastRunTime, LastTaskResult, NextRunTime LastRunTime : 8/23/2026 10:33:43 AM LastTaskResult : 0 NextRunTime : 8/23/2026 1:17:24 PM # B. What the agent says happened next. PS> Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' | >> Where-Object Id -eq 26 | Select -First 4 TimeCreated, Id, Message TimeCreated Id Message ----------- -- ------- 8/23/2026 10:42:29 AM 26 Windows Update successfully found 0 updates. 8/23/2026 10:42:22 AM 26 Windows Update successfully found 0 updates. 8/23/2026 10:35:16 AM 26 Windows Update successfully found 1 updates. 8/23/2026 10:35:01 AM 26 Windows Update successfully found 1 updates. # C. The shape of the channel over six weeks (14 Jul - 23 Aug 2026). PS> Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' | >> Group-Object Id | Select Name, Count Name Count ---- ----- 25 20 # failed to check for updates 26 477 # successfully found N updates 31 2 # failed to download an update 41 101 # an update was downloaded

Read that top to bottom. The orchestrator's Schedule Scan task ran at 10:33:43 and returned 0. Roughly ninety seconds later the agent logged Event 26 having found one update. Then it scheduled its next run for 13:17, unprompted.

That is the whole model in one screen: USO schedules and initiates, the agent executes and reports. Neither record alone would have told you the device was healthy.

The six-week counts make the same point at fleet scale. 477 successful scans in about forty days is roughly a dozen a day, on a device where nobody clicked anything. That is not a user checking for updates - that is the orchestrator's randomised schedule doing its job, and it is the baseline you should expect on a healthy managed endpoint.

The 20 Event 25 failures against 477 successes is also the right way to read intermittent errors. A scan failure rate around four per cent on a corporate network, with successes either side, is transient - most likely network or proxy. It is not a broken client, and it is certainly not a reason to reset the update stack.

One honest caveat on that correlation, because it is the kind of thing that gets over-claimed. Event 26 records the process ID that emitted it, and that is a genuinely useful handle - Microsoft's own log documentation notes that "each component, such as the USO, Windows Update engine, COM API callers, and Windows Update installer handlers, has its own process ID". But those processes are long gone by the time you read the log, and PIDs get reused, so resolving one after the fact tells you nothing reliable.

Which is the real lesson. Event 26 proves the agent completed a scan. It does not prove USO asked for it - a script calling the COM API produces an identical event. If you need to know who initiated a scan, the task history and the orchestrator ETL are the records that answer it, and wuauclt /detectnow will never appear in either.

References

All device output in this article was captured read-only on 23 August 2026 from a single managed Windows 11 Enterprise 25H2 endpoint, build 26200.9168, with a 10.0.26100.9156 servicing stack. Console blocks are reformatted for width and have GUIDs and long paths truncated where marked; no command in this article modifies a device. Version numbers, file paths, task actions, registry values, ETW session details and event counts are all as measured on that machine and will differ on yours - verify before you build a check on them.

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

More from EndpointWeekly

Windows Update
WindowsUpdate.log is 276 bytes of pointer text: reading the real…
Windows Update stopped writing a text log in Windows 8.1; the evidence is now binary ETW…
Windows Update
The Windows patching triage decision tree: which log, which key,…
Route each patching symptom to the one evidence source that answers it. Then learn the…
Windows Update
One read-only PowerShell collector for Windows patching failures…
Test-Path and value checks return confidently wrong patching verdicts on real devices.…