Windows Server 2016 no descarga actualizaciones (0%): guía definitiva para reparar Windows Update y WSUS

¿Windows Server 2016 se queda “Descargando actualizaciones 0%” de forma indefinida? Aquí tienes una guía práctica, probada en campo, para desbloquear Windows Update paso a paso (de lo más simple a lo más profundo) sin reinstalar el sistema.

Índice

Síntoma y contexto

En servidores con Windows Server 2016 puede ocurrir que Windows Update detecte actualizaciones, inicie la descarga y quede permanentemente en 0%. El problema suele relacionarse con cachés corruptas, servicios detenidos, políticas WSUS, limitaciones de red/proxy o componentes de mantenimiento (SSU/CU) fuera de secuencia.

Solución rápida (resumen ejecutivo)

  1. Reset de Windows Update (vaciar SoftwareDistribution y Catroot2).
  2. Revisar proxy/firewall y limpiar WinHTTP.
  3. Comprobar integridad con SFC y DISM.
  4. Validar GPO/WSUS (URL, aprobaciones, “UseWUServer”).
  5. Analizar logs (Get-WindowsUpdateLog y Visor de eventos).
  6. Instalación manual: primero SSU, luego CU, reiniciar y reintentar.

Checklist de pre-requisitos

Qué revisarCómo comprobarResultado esperado
Conectividad a Internet/WSUSTest-NetConnection a tu gateway/WSUS; ping a dominios públicos si la política lo permiteLatencia estable, sin pérdidas
Hora/fecha/NTPSincronía con NTP corporativo (w32tm /query /status)Desfase < 5 minutos
Reinicio pendienteClave RebootPending o mensaje “Pending reboot” en Windows UpdateSi hay reinicio pendiente, reiniciar
Espacio en disco> 5–10 GB libres en C:Evita fallos por falta de espacio

Servicios clave (deben estar iniciados y en Automático)

  • Windows Update (wuauserv)
  • Background Intelligent Transfer Service (BITS)
  • Cryptographic Services (CryptSvc)
  • Windows Installer (msiserver)
  • Windows Modules Installer (TrustedInstaller)
  • Delivery Optimization (DoSvc) — si se usa
# PowerShell (Admin)
'wuauserv','bits','cryptsvc','msiserver','TrustedInstaller','DoSvc' | ForEach-Object {
  Set-Service -Name $_ -StartupType Automatic -ErrorAction SilentlyContinue
  Start-Service -Name $_ -ErrorAction SilentlyContinue
}
Get-Service wuauserv,bits,cryptsvc,msiserver,TrustedInstaller,DoSvc | Format-Table -Auto

Limpieza “clásica” de componentes de Windows Update

Esta limpieza fuerza a Windows a reconstruir las cachés y suele resolver el 0% perpetuo.

:: CMD (Administrador)
net stop wuauserv
net stop cryptSvc
net stop bits
net stop msiserver

ren C:\Windows\SoftwareDistribution SoftwareDistribution.old
ren C:\Windows\System32\catroot2 Catroot2.old

net start wuauserv
net start cryptSvc
net start bits
net start msiserver 

Proxy, TLS e inspección SSL

Los proxys mal configurados o la inspección TLS sin excepciones suelen bloquear Windows Update.

  • WinHTTP vs WinINET: Windows Update usa la configuración de WinHTTP, no la del navegador.
  • Si hay proxy corporativo, habilita excepciones para dominios de Microsoft Update/WSUS (sin listar dominios aquí por política, coordínalo con tu equipo de red).
:: Ver y limpiar configuración de proxy de WinHTTP
netsh winhttp show proxy
netsh winhttp reset proxy
:: (Opcional) importar la configuración del navegador
netsh winhttp import proxy source=ie

Habilitar TLS 1.2 (recomendado en entornos antiguos):

:: Habilitar TLS 1.2 para cliente SCHANNEL
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f
:: Ampliar protocolos seguros por defecto de WinHTTP (TLS 1.1/1.2)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" /v DefaultSecureProtocols /t REG_DWORD /d 0xA00 /f

Nota: puede requerir reinicio para aplicar totalmente.

Comprobar integridad del sistema

sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth
Si DISM pide archivos fuente, monta el ISO de instalación (D:\) y usa:
DISM /Online /Cleanup-Image /RestoreHealth /Source:wim:D:\sources\install.wim:2 /LimitAccess

Revisar y ajustar directivas (GPO) de Windows Update

Abre gpedit.mscComputer ConfigurationAdministrative TemplatesWindows ComponentsWindows Update y valida:

  • Configure Automatic Updates” no debe bloquear descargas.
  • Si usas WSUS: URL/puerto correctos y aprobaciones vigentes.

Vía registro del cliente:

reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate"
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU"

La clave UseWUServer (=1 usa WSUS, =0 usa Windows Update) es crítica. Tras cambios de GPO:

gpupdate /force

Analizar el registro de Windows Update

# Genera WindowsUpdate.log en el escritorio
Get-WindowsUpdateLog

Revisa también en el Visor de eventos:

  • Applications and Services LogsMicrosoftWindowsWindowsUpdateClientOperational
  • Applications and Services LogsMicrosoftWindowsBits-ClientOperational

Claves a buscar: errores de conexión (timeout), problemas de hash (daño de descarga), SSU faltante o fallos de BITS.

Instalación manual: SSU + CU

  1. Identifica e instala primero el Servicing Stack Update (SSU) más reciente para Windows Server 2016.
  2. Luego instala el Cumulative Update (CU) correspondiente.
  3. Reinicia, abre Windows Update y reinicia el ciclo de detección/descarga.

Consejos:

  • Busca por KB en el Microsoft Update Catalog (sin enlace) y descarga el paquete .msu adecuado (x64).
  • Comprueba lo ya instalado: DISM /Online /Get-Packages | findstr KB
  • Instala manualmente: wusa.exe <KBxxxxxxx.msu> /quiet /norestart

Forzar un nuevo escaneo de actualizaciones

Tras cualquier corrección, fuerza un escaneo limpio:

wuauclt /resetauthorization /detectnow
wuauclt /reportnow
:: Alternativa en Server 2016
UsoClient StartScan
UsoClient StartDownload
UsoClient StartInstall
:: O bien
schtasks /Run /TN "\Microsoft\Windows\UpdateOrchestrator\Schedule Scan"

Depuración de BITS (descargas)

# Listar trabajos BITS actuales (todas las sesiones)
Get-BitsTransfer -AllUsers | Format-List *
Cancelar trabajos atascados
Get-BitsTransfer -AllUsers | Remove-BitsTransfer -Confirm:$false

Mantenimiento post-reparación

# Liberar componentes antiguos y reducir el tamaño de WinSxS
Dism /Online /Cleanup-Image /StartComponentCleanup /ResetBase
Limpiar archivos temporales de Windows Update (una vez verificado el correcto estado)
rd /s /q C:\Windows\SoftwareDistribution.old 2&gt;nul
rd /s /q C:\Windows\System32\Catroot2.old 2&gt;nul

Tabla: servicios y su función

ServicioNombreFunción principal
Windows UpdatewuauservOrquesta detección, descarga e instalación
Background Intelligent TransferBITSDescarga en segundo plano y robusta
Cryptographic ServicesCryptSvcValidación de firmas y catálogos
Windows InstallermsiserverInstalación de MSI dependientes
Modules InstallerTrustedInstallerInstala actualizaciones del sistema
Delivery OptimizationDoSvcOptimización/compartición de descargas (si aplica)

Tabla: errores frecuentes y pistas

CódigoDescripción breveQué probar
0x80072EE2 / 0x8024401CTimeout / proxyRevisar proxy, excepciones TLS, netsh winhttp reset proxy
0x800F081FFaltan archivos fuenteDISM con /Source desde ISO
0x800F0922Partición reservada insuficienteExtender partición reservada o liberar espacio
0x8024A105 / 0x8024001EError de cliente/servicio WUReiniciar servicios, limpieza de cachés, revisar logs

WSUS: comprobaciones específicas del cliente

  • Comprueba que el servidor esté asignado al grupo correcto en WSUS y que las actualizaciones estén aprobadas.
  • Verifica UseWUServer y las URL de WUServer/WUStatusServer en el registro.
  • Si el servidor se clonó a partir de una imagen, regenera el identificador WSUS del cliente para evitar duplicados:
net stop wuauserv
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientId /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientIdValidation /f
net start wuauserv
wuauclt /resetauthorization /detectnow

Acciones opcionales (casos persistentes)

  • Reset de red: netsh winsock reset y netsh int ip reset (requiere reinicio).
  • No deshabilites IPv6 salvo que sea estrictamente necesario; puede romper rutas hacia servicios de Microsoft.
  • Revisar antivirus/EDR: excluye temporalmente carpetas de SoftwareDistribution/Catroot2.
  • Discos/volúmenes: si hay errores en NTFS, ejecuta un chkdsk programado fuera de horario.

Lista “lista para copiar” (secuencia sugerida)

  1. Reset WU (bloque de limpieza de cachés).
  2. Proxy/Firewall (mostrar y resetear WinHTTP; excepciones TLS).
  3. SFC/DISM (integridad del sistema y reparación de imagen).
  4. GPO/WSUS (validar políticas, UseWUServer, aprobaciones).
  5. Logs (Get-WindowsUpdateLog, Visor de eventos, BITS).
  6. SSU + CU manual (reiniciar y reintentar Windows Update).

Script de automatización guiada (PowerShell)

Ejecuta en PowerShell con privilegios de administrador. Útil para servidores críticos (ejecútalo fuera de horario).

# Repair-WS2016-Update.ps1 (simplificado y seguro)
[CmdletBinding(SupportsShouldProcess)]
param(
  [switch]$SkipTLS,
  [switch]$NoCleanupOldFolders
)

function Write-Info(\$msg){ Write-Host "\[INFO] \$msg" }
function Try-Start(\$svc){ Try { Set-Service \$svc -StartupType Automatic -ErrorAction Stop; Start-Service \$svc -ErrorAction Stop; Write-Info "Servicio \$svc iniciado." } Catch { Write-Info "No se pudo iniciar \$svc: \$($\_.Exception.Message)" } }

Write-Info "Comprobando espacio libre..."
Get-PSDrive -Name C | ForEach-Object { if (\$.Free -lt 10GB) { Write-Info "Advertencia: menos de 10GB libres en C: (\$(\[math]::Round(\$.Free/1GB,1)) GB)" } }

Write-Info "Iniciando/auto servicios clave..."
'wuauserv','bits','cryptsvc','msiserver','TrustedInstaller','DoSvc' | ForEach-Object { Try-Start $\_ }

Write-Info "Deteniendo servicios para limpiar cachés..."
Stop-Service wuauserv,bits,cryptsvc,msiserver -Force -ErrorAction SilentlyContinue

Write-Info "Renombrando SoftwareDistribution/Catroot2..."
\$sd = "\$env\:windir\SoftwareDistribution"
\$cr = "\$env\:windir\System32\catroot2"
if (Test-Path \$sd){ Rename-Item \$sd "\${sd}.old" -ErrorAction SilentlyContinue }
if (Test-Path \$cr){ Rename-Item \$cr "\${cr}.old" -ErrorAction SilentlyContinue }

Write-Info "Reiniciando servicios..."
Start-Service wuauserv,bits,cryptsvc,msiserver -ErrorAction SilentlyContinue

if (-not \$SkipTLS){
Write-Info "Habilitando TLS 1.2 en SCHANNEL/WinHTTP (puede requerir reinicio)..."
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Force | Out-Null
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name "Enabled" -Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name "DisabledByDefault" -Value 0 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" -Name "DefaultSecureProtocols" -Value 0xA00 -PropertyType DWord -Force | Out-Null
}

Write-Info "Reseteando proxy WinHTTP..."
& netsh winhttp reset proxy | Out-Null

Write-Info "Ejecutando SFC..."
sfc /scannow

Write-Info "Ejecutando DISM RestoreHealth..."
DISM /Online /Cleanup-Image /RestoreHealth

Write-Info "Forzando escaneo de actualizaciones..."
& wuauclt /resetauthorization /detectnow
& wuauclt /reportnow
& UsoClient StartScan

Write-Info "Hecho. Revisa Windows Update. Si sigue en 0%, procede con SSU+CU manual." 

Buenas prácticas para evitar recaídas

  • Mantén SSU al día: sin SSU reciente, muchos CU fallan o no descargan.
  • Garantiza espacio libre en C: (monitoriza la unidad del sistema).
  • Evita inspección SSL sobre Windows Update o agrega exclusiones explícitas.
  • No desactives IPv6 sin una razón técnica justificada.
  • Controla reinicios pendientes tras CU grandes y .NET.

Preguntas frecuentes

¿Puedo borrar “SoftwareDistribution.old” y “Catroot2.old”?
Sí, una vez que confirmes que Windows Update funciona tras la reparación. Bórralos para recuperar espacio.

¿Cómo sé si necesito SSU?
Si los CU no se instalan o la descarga se estanca, instala primero el SSU más reciente; a menudo es el desbloqueo que falta.

¿BITS o Delivery Optimization?
En Server 2016 la descarga se apoya principalmente en BITS; DO puede intervenir en ciertos escenarios. Activa ambos servicios.

¿Qué pasa si el servidor usa WSUS y fue clonado?
Regenera el SusClientId (ver sección WSUS). Los duplicados en WSUS provocan estados incoherentes y colas bloqueadas.

Conclusión

Con el plan anterior —verificaciones rápidas, servicios, limpieza de cachés, red/proxy/TLS, integridad del sistema, revisión de GPO/WSUS, análisis de logs y, si es necesario, instalación manual de SSU+CU— la gran mayoría de casos de “Descargando actualizaciones 0%” en Windows Server 2016 se resuelven sin reinstalar ni realizar cambios drásticos. Ejecuta los pasos en orden, valida después de cada bloque y documenta los hallazgos para fortalecer tu estándar operativo.


Secuencia de referencia rápida

  1. Reset de Windows Update (cachés).
  2. Proxy/Firewall/TLS (WinHTTP y excepciones).
  3. Integridad con SFC/DISM.
  4. GPO/WSUS (URL, “UseWUServer”, aprobaciones).
  5. Logs (WindowsUpdate.log, eventos BITS/WU).
  6. SSU + CU manual, reinicio y reintento.

Causas típicas del 0% fijo: caché corrupta de SoftwareDistribution/Catroot2, proxy o inspección SSL agresiva, SSU ausente, reinicio pendiente o falta de espacio en disco.

Tip final: tras el “reset” y el SSU correcto, el porcentaje suele moverse casi de inmediato; si permanece en 0%, vuelve a BITS y al proxy.

Índice