Si desea en su entorno reparar actualizaciones Windows faltantes, debería emplear un proceso estructurado y consciente del riesgo que separe diagnóstico, medidas de reparación escalonadas y validación del lado del servidor. „Fehlend“ es, en los informes de WSUS, un estado de reporting: no significa automáticamente que una actualización no se instaló — con frecuencia hay errores de detección, conflictos de targeting o metadatos de WSUS detrás. Esta guía explica cómo comprobar, reparar y documentar de forma automatizada con PowerShell en los clientes y con la API de WSUS en el servidor — incluyendo códigos de error típicos, orquestación, estrategias de reversión y límites operativos.
Resumen: Por qué funciona una reparación estructurada
El objetivo no es „arreglar“ todos los clientes al mismo tiempo, sino identificar primero la causa y luego corregirla con la medida más pequeña y segura posible. un runbook escalonado reduce efectos colaterales (p. ej., reinicios innecesarios, carga de ancho de banda) y permite rollback controlados. PowerShell actúa como herramienta de orquestación para diagnóstico, reparación local e informes agregados; la API de WSUS (Microsoft.UpdateServices.Administration) posibilita comprobaciones del lado del servidor como estado de aprobación, grupos de ordenadores y clientes „stale“.
Causas típicas y cómo se distinguen
Para reaccionar de forma dirigida, clasifique las causas en categorías:
- Erkennung/Scanning: El agente de actualización Windows (WUA, responsable de la detección e instalación) no realiza un escaneo exitoso — a menudo por datos WMI/Component‑Based‑Servicing (CBS) corruptos o por problemas de red.
- Policy/Targeting: GPOs, registros locales (Registry) o el targeting del servidor (grupos de ordenadores de WSUS) están mal configurados. El Dual Scan (uso simultáneo de WSUS y Microsoft Update) también puede provocar comportamientos inesperados.
- WSUS‑Server/Metadaten: Actualización no aprobada, superseded (reemplazada) o problemas en la SUSDB (base de datos de WSUS) que generan reporting incorrecto.
- Installationsprobleme: Descargas BITS colgadas, espacio insuficiente, bloqueadores en el instalador o reinicio pendiente.
Condiciones previas y reglas operativas
Antes de automatizar, defina:
- Qué máquinas están dentro del alcance (grupos de producción frente a grupos piloto).
- Si están permitidos reinicios automáticos y en qué ventana de mantenimiento.
- Dónde se centralizan los logs (p. ej., SMB‑Share, SIEM o Logstash) y en qué formato (se recomienda JSON).
- En qué host pueden ejecutarse los scripts que usan la API de WSUS (normalmente el servidor WSUS o un host administrativo endurecido con las herramientas WSUS instaladas y los permisos adecuados).
Estrategia de comprobación: Diagnóstico antes de la reparación
Realice en el cliente un diagnóstico conservador que recopile hechos pero no haga cambios. La siguiente información es el mínimo:
- Conectividad de red hacia WSUS (DNS, puerto TCP 8530/8531).
- Política de actualizaciones actual (resultados de GPO/Registry).
- Estado de servicios relevantes (wuauserv, BITS, UsoSvc).
- Indicadores de reinicio pendiente (claves del Registry) y capacidad libre en disco.
- Últimos eventos de actualización Windows y códigos de error específicos.
Diagnóstico del cliente con PowerShell (script de recolección conservador)
Este ejemplo captura los datos básicos localmente o por Remoting y escribe un registro JSON. No modifica el sistema y por tanto tiene bajo riesgo.
#requires -RunAsAdministrator
param(
[string]$WsusServerFqdn = 'wsus01.contoso.local',
[int]$WsusPort = 8530,
[string]$LogPath = 'C:ProgramDataUpdateRepairdiag.json'
)
$ErrorActionPreference = 'Stop'
function Test-TcpPort{param($HostName,$Port) (Test-NetConnection -ComputerName $HostName -Port $Port -WarningAction SilentlyContinue) }
function Get-PendingRebootState{ $keys=@('HKLM:SOFTWAREMicrosoftWindowsCurrentVersionComponent Based ServicingRebootPending','HKLM:SYSTEMCurrentControlSetControlSession ManagerPendingFileRenameOperations'); @(foreach($k in $keys){ if(Test-Path $k){ $k } }) }
$diag=[ordered]@{}
$diag.Timestamp=(Get-Date).ToString('o')
$diag.ComputerName=$env:COMPUTERNAME
$diag.WsusConnectivity=Test-TcpPort -HostName $WsusServerFqdn -Port $WsusPort
$diag.WsusPolicy=(Get-ItemProperty -Path 'HKLM:SOFTWAREPoliciesMicrosoftWindowsWindowsUpdate' -ErrorAction SilentlyContinue) | Select * -ErrorAction SilentlyContinue
$diag.PendingReboot=Get-PendingRebootState
$diag.Services=Get-Service -Name wuauserv,BITS,UsoSvc -ErrorAction SilentlyContinue | Select Name,Status
$diag.FreeSpaceGB=[math]::Round((Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace/1GB,2)
$diag.LastWUEvent=(Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-WindowsUpdateClient'; StartTime=(Get-Date).AddDays(-7)} -MaxEvents 20 -ErrorAction SilentlyContinue) | Select TimeCreated,Id,Message
New-Item -ItemType Directory -Path (Split-Path $LogPath) -Force | Out-Null
$diag | ConvertTo-Json -Depth 8 | Set-Content -Path $LogPath -Encoding UTF8
Write-Host "Diagnóstico guardado: $LogPath"Runbook de reparación escalonado (seguro y con riesgo minimizado)
Utilice un modelo de 4 niveles. Ejecute cada nivel solo si el nivel anterior no ha solucionado la causa.
Nivel 0 — Criterios de interrupción
- Espacio libre insuficiente (< 5 GB) → Liberar espacio de almacenamiento en lugar de un restablecimiento.
- Reinicio pendiente → Reinicio en la ventana de mantenimiento definida.
- WSUS no accesible → Verificar red/firewall/proxy; no aplicar correcciones en el cliente.
Nivel 1 — Estabilizar servicios e iniciar escaneo
Esta es la reparación menos arriesgada: comprobar/reiniciar servicios y desencadenar el escaneo de actualizaciones. A menudo es suficiente.
#requires -RunAsAdministrator
$services=@('wuauserv','BITS','UsoSvc')
foreach($svc in $services){ $s=Get-Service -Name $svc -ErrorAction SilentlyContinue; if($s -and $s.Status -ne 'Running'){ Start-Service -Name $svc }}
try{ Start-Process -FilePath "$env:SystemRootSystem32UsoClient.exe" -ArgumentList 'StartScan' -NoNewWindow -WindowStyle Hidden } catch { }
Write-Host 'Escaneo iniciado. Supervisar eventos.'
Nivel 2 — Reinicio suave: renombrar SoftwareDistribution
En descargas atascadas o metadatos corruptos se detienen los servicios, se renombra el directorio (permitiendo un rollback sencillo) y se reinician los servicios.
#requires -RunAsAdministrator
$stamp=(Get-Date).ToString('yyyyMMdd-HHmmss')
$sd="$env:windirSoftwareDistribution"
$sdBak="$sd.bak.$stamp"
$stop=@('wuauserv','BITS','cryptsvc')
foreach($svc in $stop){ Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue }
if(Test-Path $sd){ Rename-Item -Path $sd -NewName (Split-Path $sdBak -Leaf) -ErrorAction Stop }
foreach($svc in $stop[-1..0]){ Start-Service -Name $svc -ErrorAction SilentlyContinue }
Write-Host "Restablecimiento completado. Copia de seguridad: $sdBak"
Nivel 3 — Reparaciones invasivas (DISM/SFC/WMI)
Solo con indicación clara: DISM/SFC reparan daños relacionados con componentes, los reinicios de WMI afectan a la inventariación y a las herramientas de gestión — pruébelos antes en un grupo piloto.
#requires -RunAsAdministrator
Start-Process -FilePath "$env:SystemRootSystem32dism.exe" -ArgumentList '/Online','/Cleanup-Image','/RESToreHealth' -Wait -NoNewWindow
Start-Process -FilePath "$env:SystemRootSystem32sfc.exe" -ArgumentList '/scannow' -Wait -NoNewWindow
Write-Host 'DISM/SFC abgeschlossen. Logs prüfen.'
Nivel 4 — Medidas responsables: Reinstalación/Reparación del agente
Como última medida, una reparación/reinstalación del Windows Update Agent (WUA) o intervenciones a nivel de sistema; estos pasos deben gestionarse mediante gestión de cambios y documentarse.
Reparar actualizaciones faltantes de Windows: códigos de error y soluciones típicas
Comprender los códigos de error frecuentes ayuda a elegir el nivel correcto. Aquí algunos ejemplos:
- 0x8024401c → problema de comunicación entre cliente y WSUS (proxy, TLS, DNS). Solución: comprobar WinHTTP/proxy, verificar la cadena de CA y el endpoint de WSUS.
- 0x80072ee7 → error de DNS/red: nombre no resoluble o IP incorrecta (p. ej., vía HOSTS/exclusión de proxy).
- 0x80248007 → error al almacenar metadatos de actualización (SoftwareDistribution). Un reinicio suave (renombrado) suele ayudar.
- 0x80242006 → error de instalación del paquete; comprobar los logs del instalador (CBS/ESD) y, si procede, ejecutar DISM/SFC.
Puede encontrar los códigos de error en los eventos de actualización de WindowsUpdate‑Events (registro del sistema) y en C:WindowsWindowsUpdate.log (actualmente generados mediante Get-WindowsUpdateLog).
Comprobaciones de WSUS en servidor con la API de WSUS
Los scripts de WSUS se ejecutan en el servidor WSUS o en un host de administración. Utilice el ensamblado Microsoft.UpdateServices.Administration para inventarios, comprobaciones de aprobaciones y detección de clientes ’stale‘ (sin reporte reciente).
# Auf WSUS-Server: Grunddaten
[void][reflection.assembly]::LoadWithPartialName('Microsoft.UpdateServices.Administration')
$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer('wsus01.contoso.local',$false,8530)
$cfg=$wsus.GetConfiguration()
[pscustomobject]@{ Server=$wsus.Name; Version=$wsus.Version.ToString(); TargetingMode=$cfg.TargetingMode.ToString(); LastSync=$wsus.GetSubscription().GetLastSynchronizationTime() } | Format-List
Identificar clientes ’stale‘
# Auf WSUS-Server: Clients mit >7 Tagen seit letztem Report
[void][reflection.assembly]::LoadWithPartialName('Microsoft.UpdateServices.Administration')
$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer('wsus01.contoso.local',$false,8530)
$cut=(Get-Date).AddDays(-7)
$wsus.GetComputerTargets() | Where-Object { $_.LastReportedStatusTime -lt $cut } | Select FullDomainName,LastReportedStatusTime,ClientVersion | Sort LastReportedStatusTime
Comprobar estado de aprobación
# Beispiel: Genehmigungen für Updates in einer Gruppe prüfen
[void][reflection.assembly]::LoadWithPartialName('Microsoft.UpdateServices.Administration')
$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer('wsus01.contoso.local',$false,8530)
$group=$wsus.GetComputerTargetGroups() | Where-Object { $_.Name -eq 'Production' }
$uscope=New-Object Microsoft.UpdateServices.Administration.UpdateScope; $uscope.TextIncludes='2026-'
$wsus.GetUpdates($uscope) | Select -First 20 | ForEach-Object { [pscustomobject]@{ Title=$_.Title; IsSuperseded=$_.IsSuperseded; ApprovedForGroup=[bool]($_.GetUpdateApprovals() | Where-Object { $_.ComputerTargetGroupId -eq $group.Id }) } } | Format-Table -AutoSize
Orquestación: procesamiento por lotes, control de tasa y reporting
Un orquestador central coordina los lotes, supervisa las tasas de éxito y aplica retroceso automático (backoff) ante la acumulación de errores. Principios básicos:
- Lote por ubicación/subred o por grupo de equipos (p. ej., 50 Clients por lote).
- Limitar la concurrencia (ConcurrentJobs) y usar una estrategia de reintento con backoff exponencial.
- Informes JSON centralizados por cada acción: diagnóstico, medidas, resultado, URL de logs.
Beispiel: Einfacher Batch‑Orchestrator (PowerShell)
# Einfacher Orchestrator: Clients aus Liste in Batches abarbeiten
param(
[string]$ComputerListCsv = '.clients.csv',
[int]$BatchSize=25,
[int]$ThrottleDelay=10
)
$computers=(Import-Csv $ComputerListCsv | Select-Object -ExpandProperty ComputerName)
for($i=0;$i -lt $computers.Count; $i += $BatchSize){
$batch = $computers[$i..([math]::Min($i+$BatchSize-1,$computers.Count-1))]
Write-Host "Starte Batch $((($i/$BatchSize)+1)) mit $($batch.Count) Hosts"
foreach($c in $batch){
Start-Job -ScriptBlock {
param($target)
Invoke-Command -ComputerName $target -ScriptBlock { param($ts) C:ScriptsUpdateRepairdiag-and-repair.ps1 -WsusServerFqdn 'wsus01.contoso.local' -LogPath "\file-serverlogs$env:COMPUTERNAME.json" } -ArgumentList $target -ErrorAction SilentlyContinue
} -ArgumentList $c | Out-Null
Start-Sleep -Seconds $ThrottleDelay
}
Write-Host 'Warte auf Batchabschluss...'
Get-Job | Wait-Job | Receive-Job | Out-Null
Get-Job | Remove-Job -Force
}
Write-Host 'Orchestrierung abgeschlossen.'
Dieses Muster ist bewusst einfach — in der Praxis nutzen Teams Orchestratoren (SCCM/ConfigMgr, Intune, Ansible, Rundeck) oder robuste PowerShell‑Frameworks mit Logging, SLA‑Checks und Alerting.
Mantenimiento de WSUS: cuando muchos Clients están afectados
Si varios Clients reportan los mismos problemas, la causa suele estar en el servidor. Puntos de mantenimiento importantes:
- WSUSUtil: checkhealth, reset y reindexado de la BD según las instrucciones del fabricante.
- Depurar actualizaciones: rechazar (decline) de forma selectiva las actualizaciones Superseded/obsolete en lugar de eliminarlas a ciegas.
- Mantenimiento de SUSDB: reindex y shrink vía SQL Agent (solo con autorización de DBA).
- Monitorización: métricas de rendimiento de la SUSDB (IO, locks, latencias de consultas).
# Beispiel: WSUS basic health checks (auf WSUS-Server)
& 'C:Program FilesUpdate ServicesToolswsusutil.exe' checkhealth
& 'C:Program FilesUpdate ServicesToolswsusutil.exe' reset
# Vorsicht: reset kann Bandbreite erzeugen, testen Sie in Pilotumgebung
Puntos críticos, riesgos y contramedidas
- Dual Scan: Compruebe las GPOs y las políticas de Intune — fuentes contradictorias generan inconsistencias.
- TLS/Cert‑Chains: Los errores de TLS no se resuelven mediante reinicios del cliente; compruebe la CA, la Certificate Revocation List (CRL) y la accesibilidad de OCSP.
- Reporting‑Latenz: WSUS no es apto para tiempo real. Espere ventanas adecuadas antes de iniciar reparaciones.
- Massenreboots: Evite reinicios simultáneos — planifique reinicios por oleadas (rolling reboots) dentro de las ventanas de mantenimiento.
Lista de verificación para despliegue y operación
Antes del despliegue:
- Definir grupo piloto y rollback de emergencia.
- Establecer la ruta de logs y el formato (JSON).
- Definir la política de reinicios y las ventanas de mantenimiento.
- Plan de comunicación para soporte y usuarios (en caso de reinicios/interrupciones).
Durante la ejecución:
- Trabajar por lotes, recopilar métricas, definir condiciones de parada (p. ej. >20% de tasa de error).
- En caso de tipos de fallo recurrentes, escalar a nivel de servidor (WSUS DB, proxy, PKI).
Después de la ejecución:
- Conservar backups de carpetas renombradas (p. ej. SoftwareDistribution.bak) al menos 7–14 días y luego eliminarlas.
- Registrar las lecciones aprendidas e iniciar medidas permanentes (corrección GPO, limpieza de WSUS).
Conclusión
reparar actualizaciones Windows faltantes es menos una intervención única que un proceso: diagnóstico, reparaciones escalonadas, validación en el servidor y procedimientos operativos. PowerShell y la API de WSUS proporcionan las herramientas, pero el éxito depende de reglas operativas claras, fases piloto, control de tasa (throttling) y mantenimiento de WSUS. Realice primero comprobaciones conservadoras, evite cambios invasivos masivos y documente todos los pasos de forma automatizada — así reducirá el riesgo y el esfuerzo operativo.
Recursos adicionales y enlaces internos
Planifique artículos internos/runbooks para integrar en su Change Management: „Mantenimiento de WSUS y limpieza de DB“, „Ventanas de parches y política de reinicios“ y „Panel de monitorización para cumplimiento de actualizaciones“. De este modo, las medidas descritas aquí pueden integrarse de forma orgánica en los procesos operativos existentes.
Arquitectura operativa, seguridad e indicaciones de integración
Para uso productivo, diseñe la automatización como un subsistema operacional: un host orquestador endurecido, una cola verificada y persistente (p. ej. SQL o Redis) para el estado de lotes y un repositorio de logs auditado. Ejecute scripts PowerShell firmados, restrinja los endpoints de remoting y utilice cuentas de servicio dedicadas con privilegios mínimos para las llamadas Microsoft.UpdateServices.Administration.
Las decisiones arquitectónicas afectan el riesgo y la escalabilidad: en sitios de gran tamaño, desacople el diagnóstico (lectura, bajo riesgo) de las acciones de reparación (escritura) y almacene marcadores de progreso de forma idempotente en el cliente, de modo que un trabajo pueda ejecutarse varias veces sin efectos colaterales. Utilice datos de la CMDB para excluir plantillas/golden images y respetar la ventana de mantenimiento por equipo.
La planificación de red y de contenido es crítica: utilice WSUS‑Downstream, BranchCache o Delivery Optimization para evitar descargas simultáneas. Implemente métricas y alertas (p. ej. LastReportAge, ComplianceDelta, BatchErrorRate) y retroceso automático (backoff) ante una tasa de error alta. Pruebe cada cambio en un entorno piloto con snapshot y documente los pasos de reversión (rollback‑marker, renombrado de backups). Finalmente, los logs deben almacenarse de forma estructurada (JSON), con retención adecuada y compatibilidad SIEM, de modo que Seguridad y Operaciones dispongan de vistas compartidas sobre incidentes de actualizaciones.
Para este tema también son importantes PowerShell, la API de WSUS y los grupos de destino de WSUS. El artículo contextualiza estos aspectos de forma comprensible y muestra qué resulta relevante en la práctica diaria.