Windows Server 2019/2022: perché gli aggiornamenti installati via PowerShell/COM non compaiono in “Visualizza cronologia” e come verificarli

Su Windows Server 2019/2022 può capitare che gli aggiornamenti installati via script PowerShell o tramite le API COM di Windows Update non compaiano in “Impostazioni > Windows Update > Visualizza cronologia”. Non è un bug: di seguito spiego perché succede, come verificarli e come farli apparire in cronologia.

Indice

Scenario e sintomi

Hai uno script che applica le patch ai tuoi server con uno di questi approcci:

  • API COM di Windows Update Agent (WUApiLib): Microsoft.Update.Session, UpdateSearcher, Downloader, Installer.
  • Modulo PowerShell PSWindowsUpdate (che dietro le quinte usa WUApiLib).

Al termine, la sicurezza è aggiornata, i riavvii avvengono regolarmente e i controlli di compliance (ad esempio scanner o report interni) confermano la presenza delle KB. Tuttavia:

  • “Impostazioni > Windows Update > Visualizza cronologia” non mostra le voci appena installate.
  • “Programmi e funzionalità > Disinstalla un aggiornamento” (Pannello di controllo) elenca le KB correttamente.
  • Event Viewer registra l’installazione (tipicamente nel log WindowsUpdateClient/Operational).
  • PowerShell e WMI le vedono: Get-HotFix, wmic qfe list, Get-CimInstance Win32_QuickFixEngineering.

In breve: patch installate e sistema protetto, ma la voce non compare nella cronologia della nuova UI. È un comportamento previsto.

Perché gli aggiornamenti non appaiono nella cronologia

La cronologia legge solo il database di Windows Update

La pagina “Visualizza cronologia” interroga il database locale di Windows Update (%windir%\SoftwareDistribution\DataStore\DataStore.edb), che viene aggiornato dal motore WU (wuauserv / UsoSvc) quando un’installazione è orchestrata dal servizio Windows Update (WU), da WSUS o da Windows Update for Business (WUfB). In questo caso, oltre al vero e proprio payload, viene scritta una traccia transazionale nel DataStore: stato, timestamp, sorgente, risultato.

Installazioni “amministrative” avviate da script

Quando l’installazione parte da codice COM (IUpdateInstaller) o da PSWindowsUpdate, è possibile che il flusso non percorra il percorso standard che aggiorna il DataStore. In molte circostanze l’operazione è registrata come installazione amministrativa (nel log event viene spesso indicato Context = 2) e non produce la voce nella cronologia della UI moderna. Il risultato resta perfettamente valido (file e componenti CBS vengono installati, il componente TrustedInstaller applica i pacchetti, eventuali riavvii avvengono), ma la cronologia della UI non viene alimentata.

Conclusione: non c’è alcun “flag mancante” nel tuo script. È una caratteristica di come la UI legge i dati: la cronologia mostra ciò che è passato dall’agente WU in una determinata modalità, non tutte le installazioni possibili.

Dove vedere davvero se la patch è presente

Per la verifica di produzione, usare metodi che interrogano lo stato effettivo del sistema:

MetodoComando / PercorsoNote
Event ViewerApplications and Services Logs → Microsoft → Windows → WindowsUpdateClient → OperationalCerca Event ID tipici: 19 (installazione riuscita), 20 (fallita), 21 (riavvio richiesto). Filtra per “KB<numero>”.
PowerShellGet-HotFix -Id KB<numero>Immediato per la gran parte delle KB cumulative e dei security-only.
WMIwmic qfe list | find "KB<numero>"Equivalente a Get-HotFix (classe Win32_QuickFixEngineering).
DISMdism /online /get-packages /format:tableVista CBS-centric: utile per SSU/LCU come PackageforRollupFix. Approfondisci con /Get-PackageInfo.

Esempi pratici

# Verifica rapida per una KB specifica
Get-HotFix -Id KB5030211

Verifica via DISM (mappa i pacchetti CBS, utile per i cumulativi)

dism /online /get-packages | findstr /i KB5030211

Eventi di installazione riuscita delle ultime 48 ore

$from = (Get-Date).AddHours(-48)
Get-WinEvent -LogName "Microsoft-Windows-WindowsUpdateClient/Operational" `  | Where-Object { $.TimeCreated -ge $from -and $.Id -eq 19 }`
| Select-Object TimeCreated, Id, LevelDisplayName, Message </code></pre>

<h2>Come far comparire le patch nella cronologia</h2>
<p>Se per policy operativa vuoi che la UI mostri i record in “Visualizza cronologia”, allora devi <em>far scrivere</em> il DataStore dal servizio Windows Update. Ecco le opzioni efficaci:</p>

<h3>Usare il servizio Windows Update per orchestrare l’installazione</h3>
<ul>
  <li><strong>Via comandi legacy</strong> (ancora utili in molti contesti):
    <pre><code>wuauclt /detectnow
wuauclt /updatenow

Via PowerShell con PSWindowsUpdate (orchestrazione WU/WUfB/WSUS):

# Include anche Microsoft Update (Office, SQL, ecc.)
Install-WindowsUpdate -AcceptAll -MicrosoftUpdate -AutoReboot

Nota: la sorgente deve rimanere “Windows Update/WSUS”. Se hai puntato esplicitamente a un percorso offline o se usi una modalità puramente amministrativa, la cronologia potrebbe non popolarsi.
Distribuire da WSUS o da Windows Update for Business: quando l’installazione è autorizzata dal catalogo centrale e gestita da WU, lo stato viene scritto automaticamente.

Usare pacchetti .msu con wusa.exe

In molti scenari l’installazione con wusa scambia informazioni con l’agente WU e produce la voce di cronologia:

wusa.exe Windows10.0-KB5030211-x64.msu /quiet /norestart

Limite: serve scaricare l’intero .msu (non un delta .cab) e la connessione ai componenti WU deve essere integra.

Cosa non esiste

Non c’è un parametro delle API COM o di PSWindowsUpdate tipo “AddToHistory”. È il canale d’installazione che decide se e come scrivere nel DataStore.

Approfondimento tecnico: architettura e percorsi dati

Tre viste diverse dello stesso elefante

VistaFonte datiCosa mostraPro / Contro
UI “Visualizza cronologia”DataStore.edb (WU)Installazioni orchestrate da WU/WSUS/WUfBPro: parlante per utenti helpdesk. Contro: si azzera se cancelli SoftwareDistribution, non include installazioni “amministrative”.
“Disinstalla un aggiornamento”Component-Based Servicing (CBS)Pacchetti realmente integrati nel sistemaPro: fonte di verità per lo stato. Contro: meno user-friendly.
Get-HotFix / wmic qfeWMI Win32_QuickFixEngineeringKB installate (QFE) e cumulativi più comuniPro: scriptabile, veloce. Contro: alcune voci di CBS non hanno una KB diretta.

Cos’è il Context negli eventi di Windows Update

Nel log WindowsUpdateClient/Operational le installazioni possono riportare un Context (es. Context=2) che indica l’origine dell’azione. Quando è “amministrativa”, la UI della cronologia non viene alimentata, mentre i componenti CBS e i log WU registrano comunque esito e dettagli. Questo spiega la discrepanza apparente tra “sistema aggiornato” e “cronologia vuota”.

Script utili per verifica, audit e automazione

Check di conformità per un set di KB

$kbs = @(
  'KB5030211',
  'KB5031364',
  'KB5032392'
)

$result = foreach ($kb in $kbs) {
$hotfix = Get-HotFix -Id $kb -ErrorAction SilentlyContinue
if ($hotfix) {
[pscustomobject]@{
KB        = $kb
Presente  = $true
InstalledOn = $hotfix.InstalledOn
Source    = 'Get-HotFix'
}
}
else {
$dism = (dism /online /get-packages | Select-String -Pattern $kb -SimpleMatch)
[pscustomobject]@{
KB        = $kb
Presente  = [bool]$dism
InstalledOn = $null
Source    = if ($dism) { 'DISM/CBS' } else { 'Nessuno' }
}
}
}

$result | Format-Table -Auto 

Esportare un report post-patching

$date = Get-Date -Format 'yyyyMMdd-HHmm'
$path = "C:\Temp\PatchReport-$env:COMPUTERNAME-$date.csv"

$hotfix = Get-HotFix | Select-Object HotFixID, Description, InstalledOn
$events = Get-WinEvent -LogName "Microsoft-Windows-WindowsUpdateClient/Operational" -MaxEvents 200 `
| Select-Object TimeCreated, Id, LevelDisplayName, Message

Esempio: salva due viste complementari

$hotfix | Export-Csv -Path $path -NoTypeInformation
$events | Export-Csv -Path ($path -replace '.csv$', '-events.csv') -NoTypeInformation

"Report salvati in: $path" 

Applicare patch e alimentare la cronologia

# Assicurati che la sorgente sia WU/WSUS
(per WSUS, imposta il server e il target group secondo la tua policy)
Esempio con Microsoft Update attivo
Install-WindowsUpdate -AcceptAll -MicrosoftUpdate -AutoReboot -Verbose

Buone pratiche operative

  • Server gestiti: adotta WSUS o Windows Update for Business. Usa lo script solo per avviare la scansione, eseguire l’approvazione locale o orchestrare le finestre di riavvio. Avrai cronologia completa e reportistica centrale.
  • Audit: salva una copia dei log (Event Viewer) o esporta Get-HotFix al termine di ogni ciclo di patch. È una timeline affidabile anche se la UI non mostra le voci.
  • Visibilità per il supporto: installa il primo cumulativo mensile via Windows Update (così compare in cronologia) e applica eventuali hotfix ad hoc via script. La voce in cronologia aiuterà i troubleshooting futuri.
  • Ambienti isolati: quando non puoi usare WU/WSUS, prediligi wusa.exe con pacchetti .msu completi per massimizzare la probabilità di avere una voce in cronologia.

FAQ operative

Se cancello SoftwareDistribution, perdo la cronologia?

Sì. Eliminando %windir%\SoftwareDistribution (o rigenerando il DataStore) la UI “Visualizza cronologia” si azzera. Gli aggiornamenti restano comunque installati (CBS non viene toccato) e Get-HotFix/DISM continuano a vederli.

Perché su alcuni server le voci appaiono e su altri no?

Dipende da come è partita l’installazione. Se su un nodo la patch è stata orchestrata da WU/WSUS/WUfB o via wusa, la cronologia si popola; se su un altro è stata eseguita come installazione amministrativa via COM/PSWindowsUpdate, potrebbe non esserci alcuna voce in cronologia.

Get-HotFix non trova una KB ma il server è patchato: è un problema?

Non necessariamente. Alcuni pacchetti CBS non hanno una KB “front-facing” o non vengono esposti da Win32QuickFixEngineering. In questi casi verifica con DISM (Packagefor_RollupFix) o con l’elenco “Disinstalla un aggiornamento”.

Posso forzare la scrittura nel DataStore con un parametro?

No. Non esiste un parametro documentato per “aggiungere alla cronologia”. Devi usare un canale che la UI consideri autorevole (WU/WSUS/WUfB/wusa).

USOClient, wuauclt: cosa usare oggi?

wuauclt è legacy ma spesso ancora utilizzabile per innescare rilevamenti/installa. USOClient esiste su Server 2019/2022 ma non è ufficialmente documentato; se decidi di usarlo, trattalo come best effort. La via più pulita resta orchestrare con PSWindowsUpdate puntando WU/WSUS.

Checklist di troubleshooting

  1. Conferma lo stato reale con Get-HotFix e/o DISM. Se la KB è presente, il problema riguarda solo la visualizzazione in cronologia.
  2. Controlla i log WindowsUpdateClient/Operational per Event ID 19/20/21 e il campo Context.
  3. Verifica la sorgente: il server punta a WSUS/WUfB/WU? Get-WUSettings (PSWindowsUpdate) ti mostra i valori correnti.
  4. Evita reset inutili: cancellare SoftwareDistribution cancella la cronologia ma non “ripara” una situazione che in realtà è by design.
  5. Per avere la voce in UI, reinstallare tramite WU/WSUS/wusa (se compatibile) o attendere il ciclo mensile orchestrato da WU.

Esempi COM WUApiLib (per comprendere il comportamento)

Molti script usano direttamente le interfacce COM. Ecco un frammento didattico che mostra il flusso tipico search → download → install:

$session   = New-Object -ComObject Microsoft.Update.Session
$searcher  = $session.CreateUpdateSearcher()
$result    = $searcher.Search("IsInstalled=0 and Type='Software'")
$toInstall = New-Object -ComObject Microsoft.Update.UpdateColl

foreach ($upd in $result.Updates) {
if ($upd.EulaAccepted -eq $false) { $upd.AcceptEula() }
$toInstall.Add($upd) | Out-Null
}

$downloader = $session.CreateUpdateDownloader()
$downloader.Updates = $toInstall
$downloader.Download()

$installer = $session.CreateUpdateInstaller()
$installer.Updates = $toInstall
$installationResult = $installer.Install()

$installationResult.ResultCode 

Questo flusso può installare correttamente le patch senza che la UI di “Visualizza cronologia” ottenga una voce, perché l’installazione è classificata come amministrativa. Per alimentare la cronologia, occorre lasciare che sia il servizio Windows Update ad orchestrare l’operazione.

Modello di governance consigliato

Per i team IT che desiderano sia automazione sia visibilità in UI:

  • Distribuzione: WSUS o WUfB come canale primario (autorizzazioni, deadline, anelli).
  • Automazione: PSWindowsUpdate per interrogare, pianificare finestre, forzare scansione/riavvio.
  • Visibilità: come minimo un ciclo al mese installato via WU per “marcare” la cronologia; hotfix urgenti via script se necessario.
  • Audit: pipeline che esporta Get-HotFix e gli eventi WU in S3/Blob/Share centrale dopo ogni patch window.

Rischi percepiti vs realtà

  • “Non vedo nulla in cronologia, quindi non sono patchato”Falso. Cronologia UI ≠ stato CBS del sistema. Affidati a Get-HotFix, DISM e log.
  • “È colpa di PSWindowsUpdate”Non esattamente. Il modulo usa WUApiLib; il comportamento dipende da come lo usi e dalla sorgente configurata (WU/WSUS vs percorso amministrativo).
  • “Posso importare a posteriori le voci in cronologia”No. Non c’è un’API pubblica per scrivere nel DataStore; serve installare tramite un canale che lo faccia di suo.

Strategia mista: praticità e coerenza

In molte realtà enterprise funziona bene una strategia mista:

  1. Ciclo mensile orchestrato da WSUS/WUfB (voce in cronologia garantita, governance centralizzata).
  2. Hotfix mirati via script amministrativo quando serve rapidità (niente voce in cronologia, ma evidenza in log/QFE).
  3. Report automatici che combinano le due fonti (QFE+Eventi) per fornire un quadro unificato a SecOps e Audit.

Riepilogo in una riga

Se installi patch con COM/PSWindowsUpdate e non passano dal flusso Windows Update, non compariranno in “Visualizza cronologia”; verifica con log e Get-HotFix, e se vuoi la voce in UI, esegui l’installazione tramite WU/WSUS o usa pacchetti .msu con wusa.

Appendice: comandi rapidi pronti all’uso

EsigenzaComandoNote
Forzare rilevamento e installazione WUwuauclt /detectnow & wuauclt /updatenowLegacy ma utile; richiede servizio WU attivo.
Installare da Microsoft Update via PowerShellInstall-WindowsUpdate -AcceptAll -MicrosoftUpdate -AutoRebootScrive di norma in cronologia.
Installare .msu silenziosamentewusa.exe KBxxxxxx.msu /quiet /norestartSpesso alimenta la cronologia; richiede pacchetto completo.
Elenco patch effettive (QFE)Get-HotFixFiltra con -Id per una KB specifica.
Elenco pacchetti CBSdism /online /get-packages /format:tableUtile per SSU/LCU e corrispondenze “PackageforRollupFix”.
Eventi di installazione aggiornamentiGet-WinEvent -LogName "Microsoft-Windows-WindowsUpdateClient/Operational"Event ID 19/20/21.

In sintesi

Il comportamento osservato è normale: gli aggiornamenti sono davvero installati, ma non passando dal percorso standard di Windows Update non vengono elencati in “Visualizza cronologia”. Per i controlli, affidati a Event Viewer e Get-HotFix; se ti serve la voce in UI, installa attraverso WU/WSUS o con pacchetti .msu gestiti da wusa.exe.


Indice