Back to Intelligence

The Patch Failure Nobody Noticed for Years: Why 'Compliant' Doesn't Mean Patched

SA
AlertMonitor Team
November 2, 2026
10 min read

Every IT team has that one task. Assigned under pressure, marked done in the ticket system, never actually verified. This week's war story over at The Register follows the pattern to its ugly conclusion: a manager threatened to fire a colleague, handed them a critical task as the price of keeping their job, and the task got botched. The part that should make every sysadmin wince isn't the flubbed task — it's that nobody noticed for years. And when the truth finally surfaced, the first move wasn't fixing it. It was covering up the decision that caused it.

Swap "critical task" for "patch deployment" and you have an accurate description of patch management at more organizations than anyone would like to admit. The job gets assigned. The ticket gets closed. The compliance spreadsheet gets its green checkmark. Whether the update actually installed, actually activated, and actually works — nobody asks, until an auditor, a cyber-insurance questionnaire, or an incident asks it for you.

Meanwhile, Patch Tuesday keeps getting heavier, third-party update churn (Chrome, Adobe Reader, 7-Zip, Zoom) never stops, hybrid work has scattered your estate across homes and branch offices, and MSPs are contractually on the hook for patch SLAs. The gap between "we have a patch process" and "we know the patch state of every device right now" is where outages, audit fire drills, and breaches live.

The Problem in Depth: "Approved" Is Not "Installed"

Most patch problems aren't process problems. They're visibility problems caused by tooling that was assembled, not designed. Walk through the failure modes every sysadmin will recognize:

1. Approval is treated as completion. In WSUS, you approve an update for a group and the console shows green. But approved means offered. The device still has to download, install, and reboot. If it's offline during the window, if the disk is nearly full, if the update stack is broken — the console never tells you. The update stays approved forever and installed never.

2. "Pending reboot" machines get counted as patched. This is the sneakiest one. The cumulative update installed successfully — to disk. The vulnerable code is still loaded in memory until the reboot happens. In audits I've run, 20–30% of "compliant" servers were sitting in Component Based Servicing's RebootPending state for weeks. Patched on paper, exposed in production.

3. Failures vanish without a trace. An update hits error 0x800f0922 or 0x800705b4, retries silently a couple of times, gives up. No alert fires anywhere, because the patching system doesn't do alerting and the monitoring system doesn't watch patch state. That device simply stops moving forward, and nothing in your world changes until someone checks manually.

4. Third-party software is a blind spot. WSUS and Windows Update cover Microsoft. Chrome, Firefox, Adobe Reader, 7-Zip, Notepad++ — all historically rich targets — are somebody's manual spreadsheet job. In MSP land, "patch management" in the contract and "Microsoft-only patch management" in reality is a gap you will eventually explain to a client in writing.

5. Someone broke the updater years ago and nobody looked. The classic: a "performance optimization" script in 2021 set wuauserv to Disabled on a handful of machines. Those machines have received exactly zero updates since. Nobody noticed — because nothing was watching for it.

Why these gaps exist

Siloed architecture. Patching lives in WSUS or MECM. Monitoring lives in Nagios, PRTG, or Zabbix. Tickets live in ConnectWise Manage, ServiceNow, or Jira Service Management. Maybe an RMM like NinjaOne or Syncro got bolted on for remote clients. Each tool holds a partial view, none of them owns the question "is this device actually patched right now," and the only integration between them is a technician copying status between browser tabs. Patch state gets checked when a report is generated — monthly, quarterly, or right before an audit — not continuously.

The human dynamics matter just as much

The article's manager handed off a critical task under threat, with no verification loop. IT does the same thing when patching becomes the chore nobody wants: assign it to whoever can't push back, judge success by tickets closed, and never build an independent check. A tech with six other fires burning and zero feedback will close the ticket. Months later the dashboard says 100% compliant and reality says 62% — and now the honest answer is politically expensive, so the report stays green. That's not hypothetical. It's the origin story of a remarkable number of incidents.

What it costs in practice

  • A domain controller that's been failing monthly cumulative updates since October, discovered when your cyber-insurance renewal asks for patch evidence. Three days of WSUS archaeology and a very uncomfortable conversation.
  • "My laptop is slow" tickets that trace back to a .NET update half-applied with a 40-day-old pending reboot.
  • An MSP SLA promising critical patches within 14 days — unprovable, because patch state lives in a stale export, not a live system.
  • Reboot-pending servers: you did the work, but the exposure window stays open until the restart. Nobody's waiting for your compliance report.
  • Burnout: your best tech burns the first week of every month reconciling three systems' patch data into a spreadsheet nobody trusts.

How AlertMonitor Makes Patch State a Live Fact, Not a Report

This is exactly the gap AlertMonitor's patch management module was built to close. The core principle: patch status is monitored data, not documentation.

  • Real-time status per device. Every managed Windows endpoint shows its true patch state — missing updates, failed patches, pending reboot — rollable up by site, department, or client. For an MSP, that's one NOC view across all client environments instead of a dozen WSUS consoles and a spreadsheet.
  • Deployments that respect reality. Stage patches in waves — pilot ring with IT workstations first, then departments, then servers — with per-group maintenance windows. If a patch causes trouble, roll it back from the same console instead of improvising with wusa /uninstall at midnight.
  • Patch context on every alert. Because patching and monitoring share one platform, a 2am reboot after an update fires an alert with context: planned patch reboot, device back online in four minutes, KB installed. Compare that to a mystery outage discovered by users at 8am, three "is the server down?" tickets, and a wasted morning.
  • Failures become alerts, then tickets. A failed install doesn't disappear. It surfaces as an alert with the device, KB number, error code, and last attempt time, and can auto-create a ticket in the integrated helpdesk. The tail of broken machines gets worked, not forgotten.
  • Compliance you can hand to an auditor. Compliance is computed from live device state. When the insurance renewal asks for 90 days of patch evidence, it's a filter and an export — not a three-day fire drill.

The workflow shift, concretely:

Fragmented old wayAlertMonitor
Know patch stateMonthly WSUS/MECM export into ExcelLive dashboard, drillable to device
Catch a failed updateAt the next audit, or neverSame day, as an alert + ticket
Patch-day rebootsMystery 2am outages, 8am ticket pileupContextual alert: planned reboot, already recovered
Roll back a bad patchManual uninstall across machinesStaged rollback from the console
Prove complianceReconcile three tools' exportsFilter live state, export, done

Teams running this model stop asking "are we patched?" — they can see it — and start spending that time on the exceptions.

Practical Steps: Find Your Silent Patch Failures Today

Before you trust any dashboard — including ours — verify ground truth. Run these against your estate this week. Each one finds a specific class of "assigned but flubbed."

1. Find machines that can't patch at all: a disabled or stopped Windows Update service.

PowerShell
$targets = Get-Content 'C:\reports\servers.txt'
Invoke-Command -ComputerName $targets -ScriptBlock {
    Get-Service -Name wuauserv, bits |
        Select-Object @{n='Computer';e={$env:COMPUTERNAME}}, Name, Status, StartType
} -ErrorAction SilentlyContinue |
    Where-Object { $_.Name -eq 'wuauserv' -and ($_.Status -ne 'Running' -or $_.StartType -eq 'Disabled') } |
    Export-Csv 'C:\reports\update-service-broken.csv' -NoTypeInformation

Every row in that CSV is a machine that has silently received no updates for as long as that setting has been in place.

2. Find machines that patched but never rebooted.

PowerShell
$servers = Get-Content 'C:\reports\servers.txt'
$results = foreach ($server in $servers) {
    try {
        Invoke-Command -ComputerName $server -ScriptBlock {
            [PSCustomObject]@{
                Computer      = $env:COMPUTERNAME
                PendingReboot = (Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending') -or
                                (Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired')
                LastBoot      = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
            }
        } -ErrorAction Stop
    } catch {
        [PSCustomObject]@{ Computer = $server; PendingReboot = 'Unreachable'; LastBoot = $null }
    }
}
$results | Sort-Object PendingReboot -Descending |
    Export-Csv 'C:\reports\pending-reboot.csv' -NoTypeInformation

Those registry keys are the ground truth Windows itself uses. PendingReboot = True means the fix is on disk but the old code is still running.

3. Find machines whose last update is ancient.

PowerShell
# Requires the RSAT ActiveDirectory module
$cutoff = (Get-Date).AddDays(-45)
Get-ADComputer -Filter 'OperatingSystem -like "*Server*"' -SearchBase 'OU=Servers,DC=contoso,DC=com' |
    ForEach-Object {
        $last = Invoke-Command -ComputerName $_.DNSHostName -ScriptBlock {
            Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1
        } -ErrorAction SilentlyContinue
        if (-not $last -or $last.InstalledOn -lt $cutoff) {
            [PSCustomObject]@{
                Computer    = $_.Name
                LastHotfix  = $last.HotFixID
                LastInstall = $last.InstalledOn
            }
        }
    } | Export-Csv 'C:\reports\stale-patches.csv' -NoTypeInformation

Get-HotFix misses some servicing-stack and feature updates, so treat this as triage — but anything on that list deserves a look. AlertMonitor's module doesn't rely on Get-HotFix; it reads live update state including failures and reboot flags.

4. Mixed estate? Do the same for Linux.

Bash / Shell
# Debian/Ubuntu: security updates pending install
apt-get -s dist-upgrade | grep "^Inst" | grep -i security

# RHEL/CentOS/Alma/Rocky: outstanding security updates
sudo yum check-update --security -q | grep -E "^[a-zA-Z0-9]"

5. Turn triage into a managed loop. Once you know the damage:

  1. Sync your device inventory into AlertMonitor and group it the way you operate — by department, site, or client.
  2. Define a pilot group (your own workstations), then staging waves for everyone else.
  3. Set per-group maintenance windows so reboots happen when you chose, not when the update chose.
  4. Enable the automation that matters: failed patch → alert → helpdesk ticket, and reboot-with-patch-context alerts, so the 2am restart never looks like an outage.
  5. Add a rollback policy for server groups, so a bad patch is a ten-minute reversal instead of a lost Saturday.

The point of all five steps is the same: replace assumed with verified. The story from The Register ended badly not because someone botched a task — people botch tasks all the time — but because the organization had no mechanism that would have noticed for years, and every incentive to keep it quiet once it surfaced. Your patch program should be the opposite: every deployment verified, every failure loud within hours, every report generated from reality. That's what "done" is supposed to mean.

Related Resources

AlertMonitor Patch Management & Software Updates AlertMonitor Platform Overview Book a Demo Patch Management & Software Updates Resources

patch-managementwindows-updatessoftware-updatesendpoint-patchingalertmonitorwindows-serverrmmmsp-operations

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.