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.
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:
Metodo | Comando / Percorso | Note |
---|---|---|
Event Viewer | Applications and Services Logs → Microsoft → Windows → WindowsUpdateClient → Operational | Cerca Event ID tipici: 19 (installazione riuscita), 20 (fallita), 21 (riavvio richiesto). Filtra per “KB<numero>”. |
PowerShell | Get-HotFix -Id KB<numero> | Immediato per la gran parte delle KB cumulative e dei security-only. |
WMI | wmic qfe list | find "KB<numero>" | Equivalente a Get-HotFix (classe Win32_QuickFixEngineering). |
DISM | dism /online /get-packages /format:table | Vista 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
Vista | Fonte dati | Cosa mostra | Pro / Contro |
---|---|---|---|
UI “Visualizza cronologia” | DataStore.edb (WU) | Installazioni orchestrate da WU/WSUS/WUfB | Pro: 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 sistema | Pro: fonte di verità per lo stato. Contro: meno user-friendly. |
Get-HotFix / wmic qfe | WMI Win32_QuickFixEngineering | KB installate (QFE) e cumulativi più comuni | Pro: 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
- Conferma lo stato reale con
Get-HotFix
e/o DISM. Se la KB è presente, il problema riguarda solo la visualizzazione in cronologia. - Controlla i log WindowsUpdateClient/Operational per Event ID 19/20/21 e il campo Context.
- Verifica la sorgente: il server punta a WSUS/WUfB/WU?
Get-WUSettings
(PSWindowsUpdate) ti mostra i valori correnti. - Evita reset inutili: cancellare
SoftwareDistribution
cancella la cronologia ma non “ripara” una situazione che in realtà è by design. - 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:
- Ciclo mensile orchestrato da WSUS/WUfB (voce in cronologia garantita, governance centralizzata).
- Hotfix mirati via script amministrativo quando serve rapidità (niente voce in cronologia, ma evidenza in log/QFE).
- 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
Esigenza | Comando | Note |
---|---|---|
Forzare rilevamento e installazione WU | wuauclt /detectnow & wuauclt /updatenow | Legacy ma utile; richiede servizio WU attivo. |
Installare da Microsoft Update via PowerShell | Install-WindowsUpdate -AcceptAll -MicrosoftUpdate -AutoReboot | Scrive di norma in cronologia. |
Installare .msu silenziosamente | wusa.exe KBxxxxxx.msu /quiet /norestart | Spesso alimenta la cronologia; richiede pacchetto completo. |
Elenco patch effettive (QFE) | Get-HotFix | Filtra con -Id per una KB specifica. |
Elenco pacchetti CBS | dism /online /get-packages /format:table | Utile per SSU/LCU e corrispondenze “PackageforRollupFix”. |
Eventi di installazione aggiornamenti | Get-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
.