Windows Server 2019: risolvere “Failed” su KB5037765 e KB5037932 di maggio 2024 con DISM

Su Windows Server 2019, dopo il Patch Tuesday di maggio 2024, può capitare che le CU KB5037765 (OS) e KB5037932 (.NET 3.5/4.7.2) risultino “Failed” in Windows Update nonostante più tentativi. Qui trovi una procedura collaudata con DISM, verifica puntuale e pulizia della cronologia.

Indice

Panoramica del problema

Dopo l’ondata di aggiornamenti di maggio 2024, diversi amministratori hanno riscontrato che Windows Update segnala ripetutamente il fallimento dell’installazione di:

  • KB5037765 – Cumulative Update per Windows Server 2019 (build 17763)
  • KB5037932 – Aggiornamento cumulativo per .NET 3.5 / 4.7.2

In molti casi, nella cronologia di Windows Update compare anche KB5038283 come aggiornamento .NET non riuscito, creando confusione sul reale stato del sistema.

Sintomi tipici e cosa significano

  • Ripetuti tentativi “Failed” per KB5037765 e/o KB5037932 nella GUI di Windows Update, anche dopo il riavvio.
  • Presenza di KB5038283 in stato “Failed” nonostante sia stata installata KB5037932.
  • Eventi nel registro (WindowsUpdateClient/Operational o Setup): errori generici (es. 0x802400xx) oppure componenti bloccati da cache/metadati non aggiornati.

È importante distinguere tra stato reale dei pacchetti (ciò che il sistema ha effettivamente installato) e cronologia della GUI di Windows Update, che può rimanere indietro a causa di cache o metadati corrotti.

Diagnosi rapida: verifica prima di intervenire

  1. Controlla lo stato reale con DISM
    DISM /Online /Get-Packages Se i pacchetti relativi a KB5037765 e KB5037932 risultano State : Installed, gli aggiornamenti sono presenti a prescindere dai “Failed” mostrati in GUI.
  2. Verifica la build (opzionale ma utile per audit):
    winver oppure reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v BuildLabEx
  3. Controlla lo spazio libero su %SystemDrive%: le CU possono richiedere più GB temporanei nella cache (SoftwareDistribution e component store).

Soluzione proposta e verificata

Installazione manuale con DISM

Quando Windows Update fallisce, l’installazione offline con DISM aggira la GUI e lavora direttamente sul component store, risultando spesso risolutiva.

  1. Scarica i pacchetti .msu pertinenti (KB5037765 e KB5037932) e copiali in C:\temp.
  2. Apri un prompt elevato (cmd come Amministratore) e estraili in C:\temp\cab: expand -F:* C:\temp<nome>.msu C:\temp\cab
  3. Installa il .cab con DISM: DISM /Online /Add-Package /PackagePath:C:\temp\cab<nome>.cab Ripeti per entrambi i pacchetti (OS e .NET). Al termine, riavvia il server.

Questo metodo funziona sia per KB5037765 sia per KB5037932. Se hai estratto più file .cab, applicali uno alla volta (se presenti SSU/LCU nello stesso pacchetto, DISM gestirà l’ordine corretto).

Verifica dello stato reale

Dopo il riavvio, assicurati che i pacchetti risultino installati:

DISM /Online /Get-Packages

Se vedi State : Installed per i pacchetti che contengono i riferimenti a KB5037765 e KB5037932, il sistema è effettivamente aggiornato.

Perché la GUI continua a mostrare “Failed”

  • Cache della cronologia: Windows Update conserva i risultati dei tentativi falliti precedenti e non sempre si aggiorna immediatamente dopo un’installazione offline.
  • Supersedence: KB5037932 sostituisce KB5038283 (che era un preview di fine aprile). È normale che KB5038283 rimanga “Failed” e non venga più richiesto.
  • Metadati corrotti: cartelle SoftwareDistribution e/o Catroot2 danneggiate impediscono l’allineamento della cronologia.

Pulizia della cronologia (opzionale ma consigliata)

Se vuoi ripulire la cronologia per allineare la GUI allo stato reale:

net stop wuauserv
net stop cryptSvc
net stop bits
rename %windir%\SoftwareDistribution SoftwareDistribution.old
rename %windir%\System32\catroot2 catroot2.old
net start wuauserv
net start cryptSvc
net start bits

Dopo un nuovo Check for updates, KB5038283 scomparirà o verrà marcato come “non applicabile”.

Approfondimento tecnico

Come funzionano LCU e aggiornamenti .NET

Le LCU (Latest Cumulative Update) per Windows Server 2019 includono tutti i fix precedenti e sostituiscono le CU più vecchie. Gli aggiornamenti .NET hanno una logica simile: ogni nuovo cumulativo sostituisce i precedenti e può rendere non necessario un aggiornamento preview uscito poco prima (come KB5038283 rispetto a KB5037932). Questo spiega perché la GUI può proporre o mostrare “Failed” su un pacchetto ormai superato, senza impatto sulla sicurezza.

Perché DISM funziona quando Windows Update fallisce

DISM applica direttamente i pacchetti al component store (CBS), evitando alcune dipendenze della pipeline di Windows Update (servizi BITS/WUA, metadati, cache). In presenza di cache corrotte o incongruenze nei metadati, DISM risulta più deterministico, soprattutto con pacchetti .cab estratti da .msu.

Servicing Stack e ordine di installazione

Le versioni recenti combinano Servicing Stack Update (SSU) e LCU nella stessa distribuzione oppure gestiscono automaticamente l’ordine corretto. Se usi DISM sui .cab forniti, l’ordine viene determinato dal manifest; non forzarlo manualmente a meno di casi particolari.

Procedure opzionali e best practice

Controlli di salute del sistema

  • Esegui SFC (dopo il riavvio, prima di nuovi tentativi): sfc /scannow
  • Esegui DISM RestoreHealth se sospetti corruzione del component store (richiede connettività o una source valida): DISM /Online /Cleanup-Image /ScanHealth DISM /Online /Cleanup-Image /RestoreHealth
  • Verifica che il servizio Windows Modules Installer (TrustedInstaller) sia avviato e non bloccato.
  • Assicurati di avere sufficiente spazio libero su C: (consigliati almeno 6–8 GB per stare comodi durante le CU).

Ambienti con WSUS o criteri di gruppo

  • Forza una nuova rilevazione dopo la pulizia cache: UsoClient StartScan In alcuni ambienti funziona ancora anche: wuauclt /detectnow /reportnow
  • Esegui un gpupdate per riallineare policy di Windows Update/WSUS: gpupdate /force

Alternative all’installazione via DISM

Per i pacchetti .msu puoi usare anche wusa.exe:

wusa C:\temp<nome>.msu /quiet /norestart

Tuttavia, se Windows Update ha già mostrato più “Failed”, DISM sui .cab rimane il percorso più affidabile.

Verifica finale di conformità

Oltre a DISM /Online /Get-Packages, puoi usare questi comandi per report e audit:

  • PowerShell – elenco aggiornamenti: Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 20 Nota: Get-HotFix non sempre mostra tutti i pacchetti .NET; per la visibilità completa affidati a DISM/WindowsPackage.
  • PowerShell – verifica CUs specifiche: Get-WindowsPackage -Online | Where-Object { $_.PackageName -match "KB5037765|KB5037932" } | Select-Object PackageName,ReleaseType,InstallTime,PackageState
  • WMIC rapido: wmic qfe list brief | findstr /i "KB5037765 KB5037932"

Tabella riepilogativa degli aggiornamenti di maggio 2024

Tipo di updateKBNote utili
Cumulativo OSKB5037765Include tutti i fix di sicurezza precedenti; sostituisce le CU più vecchie.
Cumulativo .NET 3.5/4.7.2KB5037932Sostituisce KB5038283 (preview di fine aprile); quest’ultimo può rimanere “Failed” senza impatto.

Domande frequenti

Se DISM /Get-Packages dice “Installed” ma la GUI mostra “Failed”, sono sicuro?

Sì. DISM interroga lo stato effettivo del component store. La cronologia della GUI è solo un registro dei tentativi e può rimanere indietro a causa della cache. Ripulendo SoftwareDistribution e Catroot2 la GUI si riallinea.

KB5038283 continua a comparire come non riuscito: devo preoccuparmi?

No. È un antecedente preview che viene sostituito da KB5037932. Può rimanere in “Failed” senza alcun effetto sulla sicurezza o sulla conformità, e in genere scompare dopo la pulizia o un nuovo scan.

Posso rimuovere un aggiornamento se crea problemi?

In casi eccezionali sì, ma fallo solo in finestra di manutenzione e dopo aver pianificato il rollback. Esempio:

DISM /Online /Get-Packages | findstr /i KB5037765
DISM /Online /Remove-Package /PackageName:<NomePacchettoCompleto>

Valuta sempre l’impatto sulla sicurezza prima di disinstallare una CU.

È meglio usare WUSA o DISM?

Se provieni da più “Failed” in Windows Update, DISM sui .cab estratti è più affidabile perché aggira cache e metadati problematici. WUSA sui .msu può funzionare ma non affronta le cause alla radice se la cache è corrotta.

Serve eseguire SFC e DISM RestoreHealth ogni volta?

Non sempre. Falli se sospetti corruzione del component store o se l’installazione offline non parte. Sono check a basso impatto, utili per prevenire ripetizioni di errori.

Uso WSUS: perché la console centrale dice una cosa e il server un’altra?

WSUS si basa su report inviati dal client. Dopo installazioni offline e pulizia cache, forza la rilevazione (UsoClient StartScan) e il report. Il dato centrale si allinea dopo il ciclo di rilevazione/sincronizzazione.

Checklist operativa

  1. Backup e finestra di manutenzione.
  2. Scarica KB5037765 e KB5037932 in C:\temp.
  3. Estrai i .msu in C:\temp\cab: expand -F:* C:\temp<nome>.msu C:\temp\cab
  4. Installa i .cab con DISM: DISM /Online /Add-Package /PackagePath:C:\temp\cab<nome>.cab
  5. Riavvia il server.
  6. Verifica lo stato reale: DISM /Online /Get-Packages
  7. Pulisci (opzionale) la cache: net stop wuauserv net stop cryptSvc net stop bits rename %windir%\SoftwareDistribution SoftwareDistribution.old rename %windir%\System32\catroot2 catroot2.old net start wuauserv net start cryptSvc net start bits
  8. Avvia una nuova rilevazione: UsoClient StartScan

Script PowerShell di esempio per automazione

Lo script seguente automatizza estrazione e installazione dei pacchetti .msu, esegue la verifica e, facoltativamente, ripulisce la cache di Windows Update. Eseguilo in una sessione elevata.

param(
  [Parameter(Mandatory = $true)]
  [string[]] $MsuPaths,
  [switch] $CleanWUCache
)

function Install-MsuWithDism {
param([string] $MsuPath)

$tempCab = Join-Path -Path $env:TEMP -ChildPath ("cab" + [IO.Path]::GetFileNameWithoutExtension($MsuPath) + "" + (Get-Date -Format "yyyyMMddHHmmss"))
New-Item -ItemType Directory -Path $tempCab -Force | Out-Null

Write-Host "Estrazione: $MsuPath -> $tempCab"
& "$env:SystemRoot\System32\expand.exe" -F:* $MsuPath $tempCab | Out-Null

$cabs = Get-ChildItem -Path $tempCab -Filter *.cab -Recurse
if (-not $cabs) {
throw "Nessun .cab trovato in $tempCab"
}

foreach ($cab in $cabs) {
Write-Host "Installazione CAB con DISM: $($cab.FullName)"
& "$env:SystemRoot\System32\dism.exe" /Online /Add-Package /PackagePath:$cab.FullName /NoRestart
if ($LASTEXITCODE -ne 0) {
throw "DISM ha restituito codice $LASTEXITCODE per $($cab.Name)"
}
}

Write-Host "Pulizia temporanei: $tempCab"
Remove-Item -Recurse -Force $tempCab
}

foreach ($msu in $MsuPaths) {
Install-MsuWithDism -MsuPath $msu
}

Write-Host "Verifica pacchetti installati (KB5037765/KB5037932):"
Get-WindowsPackage -Online | Where-Object { $_.PackageName -match "KB5037765|KB5037932" } |
Select-Object PackageName,PackageState,InstallTime | Format-Table -AutoSize

if ($CleanWUCache) {
Write-Host "Ripristino cache Windows Update..."
Start-Process -FilePath "cmd.exe" -ArgumentList '/c net stop wuauserv && net stop cryptSvc && net stop bits && rename "%windir%\SoftwareDistribution" SoftwareDistribution.old && rename "%windir%\System32\catroot2" catroot2.old && net start wuauserv && net start cryptSvc && net start bits' -Wait -Verb RunAs
Write-Host "Forzo nuova rilevazione..."
Start-Process -FilePath "$env:SystemRoot\System32\UsoClient.exe" -ArgumentList "StartScan" -WindowStyle Hidden
Write-Host "Completato. Esegui un riavvio se richiesto."
}

Errori frequenti e come interpretarli

CodiceContestoIndicazioni
0x8024001E / 0x80240034Windows UpdateProblemi di download/metadati. Procedi con pulizia cache e installazione offline.
0x800f0922DISM/WUSASpazio o connettività a Servicing Stack. Verifica spazio su C:, prova RestoreHealth.
0x80073701DISMComponenti mancanti. Esegui DISM /Online /Cleanup-Image /RestoreHealth e riprova.

Buone pratiche operative

  • Pianifica il riavvio in finestra di manutenzione, soprattutto su host Hyper‑V o ruoli critici.
  • Evita tool di “ottimizzazione” che puliscono aggressivamente WinSxS: possono rimuovere manifest indispensabili alla CU.
  • Monitora i log: C:\Windows\Logs\CBS\CBS.log e WindowsUpdate.log (da ricostruire con Get-WindowsUpdateLog).
  • Conserva i pacchetti installati per audit (nome file e hash) in un repository interno.

Conclusioni

Nel caso specifico di maggio 2024, i “Failed” multipli in Windows Update non indicano necessariamente che il server sia rimasto indietro. Se DISM /Get-Packages riporta KB5037765 e KB5037932 in stato Installed, la macchina è effettivamente aggiornata. La persistenza di KB5038283 come “Failed” è un effetto collaterale della supersedence e della cache, privo di impatti; se desideri, puoi rimuovere l’anomalia ripristinando SoftwareDistribution e Catroot2 e rieseguendo lo scan. L’installazione offline con DISM sui .cab estratti rimane la strada più affidabile per riportare rapidamente il nodo in compliance.


Riepilogo operativo in una riga: installa offline (expand → DISM), riavvia, verifica con DISM /Get-Packages, e se serve ripulisci la cache di Windows Update; puoi ignorare gli “Failed” residui se i pacchetti risultano Installed.

Nota: Esegui sempre queste operazioni con privilegi elevati e all’interno di una finestra di manutenzione programmata.

Indice