Instalaste actualizaciones con scripts en Windows Server 2019/2022 y se aplicaron correctamente, pero en Configuración > Windows Update > Ver historial de actualizaciones no aparece nada. Aquí explico qué pasa, cómo comprobar el estado real y cómo lograr que futuras instalaciones sí queden registradas.
Resumen del problema
Cuando se automatiza la instalación de parches (mediante COM Microsoft.Update
, el módulo PSWindowsUpdate
, wusa.exe
, DISM
o tareas de mantenimiento), es común que:
- Las actualizaciones figuren en Desinstalar una actualización y en el Visor de eventos.
- Comandos como
Get-HotFix
oDISM /Online /Get-Packages
confirmen el estado instalado. - Sin embargo, el panel de Ver historial de actualizaciones permanezca vacío o incompleto.
Esto no significa que los parches no estén aplicados; indica que esa vista no tiene datos que mostrar.
Qué ocurre por debajo
En Windows existen varias fuentes de información sobre actualizaciones. No todas apuntan al mismo almacén ni se rellenan con los mismos métodos de instalación.
Diferencias clave entre vistas y orígenes
Vista / Comando | Fuente de datos principal | Cuándo se actualiza | Qué muestra |
---|---|---|---|
Ver historial de actualizaciones (app Configuración) | Base de datos de Windows Update en C:\Windows\SoftwareDistribution\DataStore | Cuando la instalación la registra el servicio Windows Update (WUA) y no se ha limpiado el DataStore | Historial “de cliente” (lo que el servicio Windows Update cree haber hecho) |
Desinstalar una actualización (Panel de control) | Información de Component-Based Servicing (CBS) | Siempre que un paquete se integre o quite vía CBS | Paquetes/superpaquetes realmente presentes en el sistema |
Get-HotFix (WMI Win32_QuickFixEngineering) | WMI/CBS | Tras la instalación a nivel de paquete | Hotfixes y KBs instalados |
DISM /Online /Get-Packages | CBS | Tras la integración del paquete | Listado detallado de paquetes y su estado |
Get-WUHistory de PSWindowsUpdate | API WUA (igual que la vista de Configuración) | Solo si existe historial en DataStore | Historial de cliente Windows Update |
Por qué el historial queda vacío
- Instalación no registrada por WUA: si instalas con
wusa.exe
oDISM
MSU/CAB, el paquete se agrega a CBS (el sistema queda parcheado), pero el historial del cliente WUA puede no enterarse. - Limpieza del DataStore: al ejecutar “resets” de Windows Update (parar servicios y renombrar
SoftwareDistribution
ocatroot2
), se borra el historial. Las instalaciones pasadas permanecen en CBS, pero la app Configuración ya no muestra nada. - Servicios deshabilitados: si
wuauserv
(Windows Update) oUsoSvc
(Update Orchestrator) están detenidos o deshabilitados durante la instalación, el cliente no registra actividad. - Servicing offline o imágenes previas: si la imagen se sirvió con parches integrados antes del primer arranque, el sistema arranca ya parcheado (CBS), pero el historial de WUA empieza vacío.
- Reinstalaciones o cambios mayores: una actualización in–place o ciertas reparaciones del sistema pueden regenerar
SoftwareDistribution
y perder historial previo.
Cómo verificar que realmente están instaladas
Antes de intentar “arreglar” la vista, verifica que el servidor esté efectivamente actualizado con fuentes fiables (CBS/WMI y eventos):
Listar hotfixes por fecha
Get-HotFix | Sort-Object InstalledOn -Descending | Format-Table -AutoSize
Consultar historial del cliente WUA si existiera
Útil para comparar; puede devolver vacío si el DataStore fue limpiado:
# Requiere PSWindowsUpdate
Get-WUHistory -Last 50 | Select-Object Date, Title, Result, KB, Operation | Format-Table -AutoSize
Revisar eventos de Windows Update
# Canal: Microsoft-Windows-WindowsUpdateClient/Operational
Get-WinEvent -LogName "Microsoft-Windows-WindowsUpdateClient/Operational" `
| Where-Object { $_.TimeCreated -gt (Get-Date).AddDays(-30) } `
| Select-Object TimeCreated, Id, LevelDisplayName, Message `
| Sort-Object TimeCreated -Descending | Format-Table -AutoSize
Los eventos muestran títulos/KB y el resultado de instalación, incluso si el historial de Configuración está vacío.
Enumerar paquetes CBS con DISM
DISM /Online /Get-Packages /Format:Table
Para un análisis detallado, puedes complementar con:
# PowerShell DISM
Get-WindowsPackage -Online | Sort-Object InstallTime -Descending `
| Select-Object PackageName, ReleaseType, State, InstallTime
Cómo lograr que aparezcan en la vista de historial
No hay una forma soportada de “rellenar” retroactivamente el historial de Configuración si el DataStore se perdió o si la instalación nunca fue registrada por el cliente WUA. Lo que sí puedes hacer es asegurar que las futuras instalaciones queden registradas correctamente.
- Instala a través de WUA: usa el servicio Windows Update (WUA) para buscar, descargar e instalar. Con PSWindowsUpdate, esto equivale a
Install-WindowsUpdate
(online o contra WSUS). - Evita limpiar
SoftwareDistribution
durante o justo después de instalar. Solo haz un reset de WU cuando sea imprescindible para resolver errores de descarga/detección. - Mantén servicios activos: asegura que
wuauserv
yUsoSvc
estén en ejecución mientras el script instala. Evita políticas o tareas que detengan estos servicios durante la ventana de mantenimiento. - Usa el propio módulo PSWindowsUpdate para instalar, no mezcles instalación por
DISM
/wusa.exe
a menos que sea estrictamente necesario. - Evita “hacks” posteriores: no intentes escribir tú mismo en el DataStore; no está soportado y puede corromper el almacén.
- Planifica la auditoría: si el objetivo principal es reporte y trazabilidad, registra resultados en un log propio y apóyate en WMI/CBS y eventos, no en la vista de Configuración.
Buenas prácticas de automatización con WUA
Este patrón usa COM Microsoft.Update
para hacer que el propio cliente Windows Update lleve el control del historial, y además genera un log operativo con códigos de resultado.
Patrón de instalación con registro confiable
$ErrorActionPreference = 'Stop'
Asegurar servicios clave activos
\$services = 'wuauserv','UsoSvc'
foreach (\$svc in \$services) {
try {
Set-Service -Name \$svc -StartupType Automatic -ErrorAction SilentlyContinue
if ((Get-Service \$svc).Status -ne 'Running') { Start-Service \$svc }
} catch {}
}
\$session = New-Object -ComObject 'Microsoft.Update.Session'
\$session.ClientApplicationID = 'PatchAutomation-WUA'
\$searcher = \$session.CreateUpdateSearcher()
Criterio: software no instalado, no oculto, aplicable
\$crit = "IsInstalled=0 and IsHidden=0 and Type='Software'"
\$sr = \$searcher.Search(\$crit)
if (\$sr.Updates.Count -eq 0) {
Write-Host 'No hay actualizaciones pendientes.'
return
}
Descargar
\$downloader = \$session.CreateUpdateDownloader()
\$downloader.Updates = \$sr.Updates
\$downloader.Download()
Instalar
\$installer = \$session.CreateUpdateInstaller()
\$installer.Updates = \$sr.Updates
\$result = \$installer.Install()
Mapear códigos de resultado (OperationResultCode)
\$map = @{
0='NotStarted'; 1='InProgress'; 2='Succeeded'; 3='SucceededWithErrors'; 4='Failed'; 5='Aborted'
}
Construir registro propio
\$rows = @()
for (\$i=0; \$i -lt \$sr.Updates.Count; \$i++) {
\$u = \$sr.Updates.Item(\$i)
\$ir = \$result.GetUpdateResult(\$i)
\$rows += \[pscustomobject]@{
TimeStamp = Get-Date
Title = \$u.Title
KB = (\$u.KBArticleIDs -join ',')
Identity = \$u.Identity.UpdateID
OperationResult = \$map\[\$ir.ResultCode]
HResult = ('0x{0\:X8}' -f \$ir.HResult)
RebootRequired = \$result.RebootRequired
}
}
\$path = "C:\Logs\PatchAutomation\install-\$(Get-Date -Format yyyyMMdd-HHmmss).csv"
New-Item -ItemType Directory -Path (Split-Path \$path) -Force | Out-Null
\$rows | Export-Csv -Path \$path -NoTypeInformation -Encoding UTF8
if (\$result.RebootRequired) { Write-Host 'Se requiere reinicio.' }
Ventajas de este enfoque:
- La instalación está mediada por WUA, por lo que el historial del cliente se actualiza.
- Obtienes un reporte propio con KB,
ResultCode
yHResult
por cada actualización. - El script deja evidencia reutilizable para auditoría.
Significado de los códigos de resultado
Código | Etiqueta | Interpretación |
---|---|---|
0 | NotStarted | La operación no comenzó para ese elemento. |
1 | InProgress | Operación en curso (rara vez visto al final de la instalación). |
2 | Succeeded | Instalación correcta. |
3 | SucceededWithErrors | Instalación con advertencias; revisar HResult para detalles. |
4 | Failed | Fallo de instalación; usar eventos y HResult para diagnóstico. |
5 | Aborted | Cancelado por el usuario, política o reinicio. |
Checklist rápido para que las futuras instalaciones aparezcan
- Usar WUA o
PSWindowsUpdate
para buscar, descargar e instalar, evitando mezclar conwusa.exe
/DISM
salvo necesidad. - No borrar ni renombrar
C:\Windows\SoftwareDistribution
durante el proceso. Si debes hacerlo para resolver un error, asume que perderás el historial visible y documenta la decisión. - Garantizar que
wuauserv
yUsoSvc
estén en ejecución antes y durante el mantenimiento. - Registrar en un log propio cada KB instalado, su resultado y el código de error.
- Para auditoría, preferir
Get-HotFix
, eventos de WindowsUpdateClient y consultas a inventario centralizado (WSUS/Intune/ConfigMgr), en lugar de la vista de Configuración. - Si trabajas con imágenes base, asume que el historial empezará vacío; tu trazabilidad debe basarse en CBS y en el pipeline de construcción.
Resolución de problemas frecuentes
Faltan algunos parches en la vista pero sí están en Desinstalar una actualización
La instalación se hizo a nivel CBS (por ejemplo, wusa.exe
o DISM
) y no se registró en el cliente WUA. Nada que corregir funcionalmente; el sistema está actualizado. A futuro, instala con WUA para que quede en el historial.
El historial se vació después de ejecutar un “reset” de Windows Update
Es el efecto esperado de renombrar o limpiar SoftwareDistribution
. Las instalaciones pasadas se mantienen, pero el historial de la app Configuración no puede reconstruirse. Regístrate en fuentes fiables (CBS/WMI y eventos) a partir de ese punto.
PSWindowsUpdate devuelve historial vacío
Get-WUHistory
consulta la misma base de datos que la app Configuración. Si se limpió el DataStore, no habrá resultados. Usa Get-HotFix
y eventos para verificar.
Instalaciones por script con reinicios automáticos
Asegura que el servicio Windows Update no sea detenido por el propio script o por GPO/Task Scheduler durante el ciclo. Si el reinicio ocurre antes de que el cliente escriba su registro, el historial puede quedar inconsistente.
Necesito reportes para auditoría o cumplimiento
No dependas de “Ver historial de actualizaciones”. Implementa:
- Bitácora en CSV/JSON del script con KB, título,
ResultCode
,HResult
y la marca de tiempo. - Recolección periódica de
Get-HotFix
y eventos de Windows Update para un repositorio central. - Consola de administración (WSUS/Intune/ConfigMgr) como fuente maestra de cumplimiento.
Ejemplos prácticos adicionales
Instalar con PSWindowsUpdate y registrar resultados
# Instalar todo lo disponible y registrar en un log
$log = "C:\Logs\PSWU\install-$(Get-Date -Format yyyyMMdd-HHmmss).csv"
New-Item -ItemType Directory -Path (Split-Path $log) -Force | Out-Null
\$updates = Install-WindowsUpdate -AcceptAll -AutoReboot -IgnoreReboot \`
-Verbose -ErrorAction Continue
\$updates suele incluir KB, Título y Resultado
\$updates | Export-Csv -Path \$log -NoTypeInformation -Encoding UTF8
Verificar con varias fuentes en un solo informe
$report = [ordered]@{
HostName = $env:COMPUTERNAME
OS = (Get-CimInstance Win32_OperatingSystem).Caption
HotFixCount = (Get-HotFix).Count
WUHistoryCnt = (Get-WUHistory -Last 200 -ErrorAction SilentlyContinue | Measure-Object).Count
LastEventWU = (Get-WinEvent -LogName "Microsoft-Windows-WindowsUpdateClient/Operational" `
-MaxEvents 1 -ErrorAction SilentlyContinue).TimeCreated
}
$report | Format-List
Comprobar estado de servicios clave
Get-Service wuauserv, UsoSvc, BITS | Select-Object Name, Status, StartType
Recomendaciones para entornos con WSUS/Intune/ConfigMgr
- Aplica actualizaciones “aprobadas” mediante WUA apuntando al servidor WSUS o al servicio de gestión. Así, además de instalar, el cliente genera entradas que la consola puede inventariar.
- Evita que tareas de limpieza del agente WSUS borren
SoftwareDistribution
sin justificación. Si se hace, documenta que el historial de cliente se perderá y no es un indicador fiable de cumplimiento. - Centraliza el reporte de errores con códigos
HResult
y filtros por KB, para acelerar diagnóstico de fallos recurrentes.
Buenas prácticas de operación y mantenimiento
- Separación de objetivos: usa la app Configuración como una vista cómoda, pero considera el estado real el que proporcionan CBS/WMI y los eventos.
- Política de limpieza prudente: el “reset” de WU es útil para resolver problemas, no para rutina. Ejecutarlo de forma periódica invalida los registros del historial.
- Reinicio controlado: si el script requiere reiniciar, registra resultados antes del reinicio y confirma estado tras el arranque con una tarea programada.
- Versionado de scripts: incluye un ClientApplicationID distintivo en tus sesiones WUA para rastrear desde los eventos qué componente originó la instalación.
- Compatibilidad con Server Core: recuerda que en Server Core no tienes la app Configuración; planifica verificaciones con
Get-HotFix
y eventos desde el inicio.
Resumen ejecutivo para equipos de seguridad y auditoría
La ausencia de entradas en Ver historial de actualizaciones no es evidencia de que un servidor esté desactualizado. La vista depende de la base de datos del cliente Windows Update, que puede estar vacía por métodos de instalación programáticos o limpiezas del DataStore. La verificación de cumplimiento debe basarse en CBS/WMI (Get-HotFix
, DISM
) y en el canal de eventos de Windows Update, además de inventarios centralizados. Para que las instalaciones futuras sí aparezcan, ejecuta la instalación a través de WUA, evita limpiar SoftwareDistribution
y asegúrate de que los servicios de actualización estén activos.
Conclusión
Si las actualizaciones aparecen en Desinstalar una actualización, en Get-HotFix
y en los eventos del cliente Windows Update, el sistema está parchado. Lo que falta es la historia de cliente que usa la app Configuración, y eso depende de que el proceso pase por WUA y de que no se haya vaciado su base de datos. A partir de ahora, instala mediante WUA/PSWindowsUpdate, no resetees SoftwareDistribution
sin motivo justificado y conserva un log propio para auditoría. Con este enfoque, tendrás tanto el estado real garantizado como la experiencia visual consistente en “Ver historial de actualizaciones”.
En resumen: las actualizaciones están instaladas; la ausencia en el historial de Configuración se explica por el método de instalación o por la limpieza del DataStore. Para el futuro, centraliza la instalación en WUA, mantén activos los servicios y apóyate en fuentes de verdad (CBS/WMI y eventos) para verificación y reportes.