Windows Update con PowerShell permite buscar, instalar, ocultar y desinstalar actualizaciones sin abrir Configuración, en un equipo o en cincuenta. La herramienta más usada para eso es PSWindowsUpdate, un módulo gratuito de la Galería de PowerShell que no viene con Windows. Esta guía explica qué es, cómo instalarlo, qué comandos se usan a diario, cómo reparar Windows Update cuando deja de funcionar, cómo desinstalar una actualización de Windows que da problemas y qué trae el propio Windows sin instalar nada. Además, lo que no sale de la documentación lo medimos el 29 de octubre de 2026 en un Windows 11 Pro 26H2, sin permisos de administrador, con Windows PowerShell 5.1 y con PowerShell 7.6.9.
La guía tiene dos niveles. Si solo quiere actualizar Windows con PowerShell en su equipo, lea los apartados de instalación, comandos y el paso a paso. En cambio, si administra varios equipos, siga hasta los equipos remotos, la reparación y los escenarios. Para un primer contacto con la consola, antes conviene leer nuestra guía de PowerShell y la de módulos de PowerShell.
Qué es PSWindowsUpdate
PSWindowsUpdate es un módulo de PowerShell que maneja el cliente de Windows Update a través de la API del Agente de Windows Update (WUA), la misma que usa Configuración. Lo escribe y lo mantiene una sola persona, Michal Gajda; no es de Microsoft. El día de la prueba, la Galería de PowerShell publicaba la versión 2.2.1.5, del 20 de julio de 2024, con 1.642.913.294 descargas: es el módulo de referencia para este trabajo, pero lleva más de dos años sin versión nueva.
Medimos el paquete al descargarlo:
| Dato | Valor medido |
|---|---|
| Archivos | 7 (8 con el que añade el gestor de paquetes), 1.378 KB en total |
| Comandos | 19 cmdlets y 9 alias |
| Versión mínima | Windows PowerShell 5.1; el manifiesto declara solo la edición Desktop |
| PowerShell 7.6.9 | Carga igual, en 0,3 s, con los mismos 28 comandos |
| Firma | Válida en la DLL, el manifiesto y los archivos de formato, a nombre de «PowerClouds Michal Gajda» |
| Licencia y código | Enlaza a un repositorio de GitHub del autor |
Qué trae Windows sin instalar nada
Por otra parte, para usar Windows Update desde PowerShell no siempre hace falta un módulo: Windows ya trae algunas piezas. Conviene saber qué hace cada una:
| Herramienta | Qué hace | Lo que no hace |
|---|---|---|
| PSWindowsUpdate | Buscar, descargar, instalar, ocultar y desinstalar; historial; equipos remotos | No viene con Windows ni es de Microsoft |
Get-HotFix (incluido) | Lista algunas actualizaciones instaladas | No ve la mayoría: en el equipo de prueba, 6 de 482 entradas del historial |
Get-WindowsUpdateLog (incluido) | Convierte los registros de Windows Update en un archivo legible | No busca ni instala nada |
| API de Windows Update por COM (incluida) | Lo mismo que el módulo, escribiendo más código | No trae cmdlets: hay que programar cada paso |
usoclient y wuauclt | Órdenes antiguas de la línea de comandos | Microsoft no documenta usoclient y retiró wuauclt /detectnow |
| WSUS, Windows Update para empresas e Intune | Aprobar y programar actualizaciones para toda la empresa | No sirven para una tarea puntual en un equipo |
El módulo WindowsUpdateProvider, que traían algunas versiones de Windows 10 y de Windows Server con Start-WUScan e Install-WUUpdates, no está en el Windows 11 26H2 que medimos. Además, las direcciones de su referencia que probamos en Microsoft Learn responden 404.
Para qué sirve Windows Update con PowerShell: usos y beneficios
Configuración basta para un equipo. Sin embargo, se queda corta cuando hay que saber qué falta en veinte servidores, instalar una actualización urgente fuera de horario o dejar constancia de lo que se instaló. Ahí, precisamente, es donde Windows Update con PowerShell ahorra tiempo:
- Inventario: qué actualizaciones faltan y cuáles fallaron, equipo por equipo, en un CSV.
- Instalación controlada: solo las de seguridad, sin controladores, sin reiniciar, o una KB concreta.
- Equipos remotos: lanzar la instalación en varios servidores desde una sola consola.
- Bloqueo temporal: ocultar una actualización que rompe una aplicación mientras el fabricante la corrige.
- Reparación: devolver Windows Update a su estado de fábrica cuando deja de descargar.
- Diagnóstico: el historial completo y el registro de Windows Update, legibles y filtrables.
Actualizar Windows con PowerShell en lugar de hacerlo desde Configuración tiene, además, beneficios claros:
- Se repite igual: el mismo script hace lo mismo en todos los equipos.
- Trabaja con objetos: se filtra con
Where-Objecty se exporta conExport-Csv. - Queda escrito: el script documenta qué se instaló, dónde y cuándo.
- No depende de nadie delante: con una tarea programada se instala de noche.
Requisitos para actualizar Windows con PowerShell
Antes de instalar, en definitiva, compruebe tres cosas:
- Consola elevada. Medido: sin elevar,
Get-WindowsUpdate,Get-WURebootStatusy los comandos que cambian algo se niegan con «To perform operations you must run an elevated Windows PowerShell console.». En cambio,Get-WUHistory,Get-WULastResults,Get-WUServiceManageryGet-WUApiVersionsí responden, con un aviso. - Directiva de ejecución. Con
Restricted, el módulo no carga ni en 5.1 ni en 7: se omite su archivo de formato con «Error en la comprobación de AuthorizationManager». ConAllSignedtampoco, en una sesión sin nadie delante: la firma es válida, pero el editor no es de confianza. ConRemoteSignedcarga sin problemas. - Salida a internet, hacia la Galería de PowerShell para instalar el módulo y hacia Microsoft Update para las actualizaciones, salvo que el equipo dependa de WSUS.
¿Cuál tiene su equipo? La documentación de Microsoft se contradice en la misma página: dice que RemoteSigned es la predeterminada en Windows y, más abajo, que si no hay ninguna definida la efectiva es Restricted. Así que compruébelo con Get-ExecutionPolicy -List. Si necesita cambiarla, la guía de PowerShell explica cómo hacerlo solo para su usuario.
Cómo instalar PSWindowsUpdate
Abra PowerShell como administrador e instálelo para todos los usuarios, porque de todos modos solo funciona elevado:
Install-Module -Name PSWindowsUpdate -Scope AllUsers
En PowerShell 7.4 o posterior, el gestor nuevo es más rápido: medimos 1,4 s al descargar el módulo con Save-PSResource, frente a 8,1 s con Save-Module.
Install-PSResource -Name PSWindowsUpdate -Scope AllUsers -TrustRepository
Después, cárguelo y compruebe la versión:
Import-Module -Name PSWindowsUpdate
Get-Module -Name PSWindowsUpdate | Select-Object Name, Version
Get-Command -Module PSWindowsUpdate
Si la instalación responde «No match was found for the specified search criteria», el problema suele estar en TLS o en el proveedor NuGet. Lo explicamos paso a paso en la guía de módulos de PowerShell.
Instalar PSWindowsUpdate sin conexión a internet
En un servidor sin salida a la Galería, descárguelo en otro equipo y copie la carpeta:
New-Item -ItemType Directory -Path 'C:\Temp\Modulos' -Force | Out-Null
Save-Module -Name PSWindowsUpdate -Path 'C:\Temp\Modulos' -Repository PSGallery
Luego copie C:\Temp\Modulos\PSWindowsUpdate a C:\Program Files\WindowsPowerShell\Modules en el servidor. Por último, quite la marca de descarga de internet de los archivos copiados con Get-ChildItem -Path 'C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate' -Recurse | Unblock-File.
Comandos más comunes de PSWindowsUpdate
Estos son los comandos que más se usan. La lista completa sale con Get-Command -Module PSWindowsUpdate:
| Comando | Para qué sirve | ¿Sin elevar? |
|---|---|---|
Get-WindowsUpdate | Busca las actualizaciones pendientes | No |
Install-WindowsUpdate | Busca e instala (es un alias) | No |
Get-WUHistory | Historial de instalaciones, con resultado y KB | Sí |
Get-WURebootStatus | Dice si falta un reinicio | No |
Get-WULastResults | Fecha de la última búsqueda y de la última instalación correctas | Sí |
Hide-WindowsUpdate | Oculta una actualización para que no se instale (alias) | No |
Remove-WindowsUpdate | Desinstala una actualización por su KB | No |
Get-WUServiceManager | Lista los orígenes: Windows Update, Microsoft Update, WSUS | Sí |
Add-WUServiceManager | Registra Microsoft Update para recibir también Office y otros productos | No |
Get-WUSettings y Set-WUSettings | Leen y escriben la configuración de Windows Update | No |
Invoke-WUJob | Lanza una tarea en un equipo remoto | No |
Reset-WUComponents | Restablece los componentes de Windows Update | No |
Install-WindowsUpdate no es un comando: es un alias
Al cargar el módulo medimos 19 cmdlets y 9 alias. Varios nombres conocidos son alias de un mismo cmdlet, Get-WindowsUpdate, con un parámetro distinto:
| Alias | Equivale a |
|---|---|
Install-WindowsUpdate y Get-WUInstall | Get-WindowsUpdate -Install |
Download-WindowsUpdate | Get-WindowsUpdate -Download |
Hide-WindowsUpdate | Get-WindowsUpdate -Hide |
Show-WindowsUpdate y UnHide-WindowsUpdate | Get-WindowsUpdate -Hide:$false |
Get-WUList | Get-WindowsUpdate |
Uninstall-WindowsUpdate | Remove-WindowsUpdate |
Clear-WUJob | Get-WUJob |
Por eso, Get-Help Install-WindowsUpdate muestra la ayuda de Get-WindowsUpdate, y todos sus parámetros (48, medidos) valen también con el alias.
Actualizar Windows con PowerShell paso a paso
En una consola elevada, el ciclo completo de Windows Update con PowerShell son cuatro pasos: buscar, revisar, instalar y reiniciar.
Buscar las actualizaciones pendientes de Windows Update en PowerShell
Get-WindowsUpdate
La columna Status usa letras: D descargada, I instalada, R necesita reinicio, M obligatoria, H oculta. Para ver también los productos de Microsoft que no son Windows, como Office, añada -MicrosoftUpdate. Si el equipo depende de un servidor WSUS, buscará allí salvo que indique otro origen.
Para saber de antemano cuánto tarda, buscamos con la misma API por COM: 37,1 s en PowerShell 7 y 34,5 s en 5.1, con una sola actualización pendiente. Además, cada búsqueda consulta los servidores de Microsoft, así que no conviene lanzarla en bucle.
Instalar las actualizaciones de Windows Update desde PowerShell
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot
-AcceptAll evita que pregunte por cada actualización y, a su vez, -IgnoreReboot deja el reinicio para después. En cambio, -AutoReboot reinicia en cuanto termina, sin preguntar: úselo solo en una ventana de mantenimiento.
Instalar o excluir actualizaciones concretas
Para instalar una sola KB:
Install-WindowsUpdate -KBArticleID KB5083631 -AcceptAll -IgnoreReboot
Para instalar todo menos los controladores y una KB que da problemas:
Install-WindowsUpdate -NotCategory 'Drivers' -NotKBArticleID KB5083631 -AcceptAll -IgnoreReboot
Y para instalar solo las de seguridad y las críticas:
Install-WindowsUpdate -Category 'Security Updates', 'Critical Updates' -AcceptAll -IgnoreReboot
Los nombres de categoría van en inglés aunque Windows esté en español. Lo comprobamos: en el equipo de prueba, los títulos de las actualizaciones salían en español y sus categorías, en inglés («Security Updates», «Definition Updates», «Critical Updates»). Lo mismo pasa con -Severity, que solo acepta Critical, Important, Moderate, Low y Unspecified. Ojo también con -Title: según la ayuda del módulo, distingue mayúsculas y minúsculas.
Reiniciar cuando haga falta
Get-WURebootStatus -Silent
Get-WURebootStatus -ScheduleReboot (Get-Date -Hour 22 -Minute 0 -Second 0)
La primera orden devuelve True o False; en cambio, la segunda programa el reinicio para las 22:00 de hoy. Por cierto, en el equipo de prueba la respuesta habría sido True: las dos marcas de reinicio pendiente del registro estaban activas y la actualización de octubre seguía «en curso».
Ocultar una actualización que da problemas
Hide-WindowsUpdate -KBArticleID KB5083631 -Confirm:$false
Show-WindowsUpdate -KBArticleID KB5083631 -Confirm:$false
La primera la oculta para que Windows Update no la instale; después, la segunda la vuelve a mostrar. Ocultar es una medida temporal: las actualizaciones acumulativas del mes siguiente incluyen lo de la anterior.
Ver el historial de Windows Update con PowerShell
Get-WUHistory lee el historial completo del Agente de Windows Update, y funciona sin elevar:
Get-WUHistory -Last 20 | Select-Object Date, Result, KB, Title
Get-WUHistory | Where-Object Result -eq 'Failed' | Select-Object Date, KB, Title
En el equipo de prueba devolvió 482 entradas desde el 29 de marzo de 2026: 465 correctas, 16 fallidas y 1 en curso. Incluye las aplicaciones de Microsoft Store, las firmas de Microsoft Defender y los controladores.
No use Select-Object -First con Get-WUHistory
Este es el error más traicionero que encontramos. Get-WUHistory | Select-Object -First 3 muestra las tres filas y, acto seguido, termina PowerShell con el código de salida 1, sin ningún mensaje. Pasó igual en Windows PowerShell 5.1 y en PowerShell 7, con un Where-Object en medio y dentro de un try/catch, que no lo captura. Lo medimos lanzando las órdenes con -Command, como haría una tarea programada: todo lo que venía después ya no se ejecutó. Con otros comandos del módulo, como Get-WUServiceManager, no ocurre.
La solución es pedir las últimas entradas al propio comando, con -Last, como en el ejemplo de arriba: Get-WUHistory -Last 20 devuelve las veinte más recientes y la sesión sigue abierta.
Get-HotFix no muestra la mayoría de las actualizaciones
Por ejemplo, muchos scripts usan Get-HotFix para saber si una KB está instalada. Sin embargo, en el mismo equipo devolvió 6 entradas, y de las 31 KB distintas del historial 29 no aparecían. La explicación está en su referencia oficial: Get-HotFix lee la clase Win32_QuickFixEngineering, que no devuelve las actualizaciones instaladas por Windows Installer ni las del sitio de Windows Update. Use Get-HotFix para las acumulativas del sistema y Get-WUHistory para todo lo demás.
Las fechas del historial: UTC o local según la versión
Comparamos Get-WUHistory con el Visor de eventos para la misma actualización de Defender, y el resultado depende de la versión de PowerShell:
| Dónde se lee | PowerShell 7 | Windows PowerShell 5.1 |
|---|---|---|
La tabla en pantalla, Select-Object Date y el CSV | 16:04:40 (UTC) | 11:04:40 (hora local) |
$_.Date dentro de un filtro o una propiedad calculada | 16:04:40 (UTC) | 16:04:40 (UTC) |
| El evento 19 del Visor de eventos | 11:04:40 | 11:04:40 |
La causa es que cada fila trae dos valores con el mismo nombre: el del objeto de Windows Update, en hora universal (UTC), y otro que añade el módulo en hora local. PowerShell 7 muestra siempre el primero; la 5.1, el segundo en la tabla y el primero dentro de un filtro. Por eso, un mismo script compara mal en una versión o en la otra. Además, Get-WULastResults y la API por COM devuelven UTC en las dos versiones.
La forma segura es convertir siempre de forma explícita:
Get-WUHistory -Last 10 | Select-Object @{n = 'Fecha local'; e = { $_.Date.ToLocalTime() } }, Result, KB, Title
Funciona igual en las dos versiones, porque $_.Date devuelve UTC en ambas y ToLocalTime() trata como UTC una fecha sin zona. Sin esa conversión, en PowerShell 7 una instalación de las 21:00 de Bogotá aparece al día siguiente.
Desinstalar una actualización de Windows
Con PSWindowsUpdate, en una consola elevada:
Remove-WindowsUpdate -KBArticleID KB5083631 -IgnoreReboot
Si falla, en cambio, -WUSAMode usa wusa.exe en lugar de la API. Sin el módulo, Windows trae dos caminos:
wusa.exe /uninstall /kb:5083631 /quiet /norestart
DISM.exe /Online /Get-Packages /Format:Table
Pero hay una trampa: desde febrero de 2021, la actualización acumulativa mensual incluye la pila de servicio (SSU) en el mismo paquete. Microsoft lo dice en las notas de cada actualización, por ejemplo la de la KB5083631: wusa.exe /uninstall no funciona con ese paquete combinado, y la SSU no se puede quitar después de instalada. Para retirar la acumulativa hay que buscar su nombre con DISM /Online /Get-Packages y quitarla con DISM /Online /Remove-Package /PackageName:<nombre>.
En Configuración, la ruta es Windows Update > Historial de actualizaciones > Desinstalar actualizaciones. Aun así, Microsoft desaconseja quitar actualizaciones salvo que causen un problema concreto, porque el equipo queda sin esas correcciones.
Configurar Windows Update con PowerShell
PSWindowsUpdate trae tres comandos de configuración. Antes de usarlos, por lo tanto, conviene saber dónde escriben.
Microsoft Update: recibir también Office y otros productos
De fábrica, Windows Update solo trae actualizaciones de Windows. Microsoft Update añade otros productos de Microsoft, y se registra así:
Get-WUServiceManager | Select-Object Name, ServiceID, IsDefaultAUService
Add-WUServiceManager -MicrosoftUpdate -Confirm:$false
El identificador de Microsoft Update es 7971f918-a847-4430-9279-4a52d1efe18d, el mismo que documenta Microsoft. En el equipo de prueba ya era el origen predeterminado.
Ojo con la ayuda del módulo: describe al revés los parámetros -WindowsUpdate y -MicrosoftUpdate, porque cada uno cita el identificador del otro. Leímos el código de la DLL: -MicrosoftUpdate usa el identificador de Microsoft Update, como su nombre indica. Fíese del nombre del parámetro, no de su descripción.
Set-WUSettings escribe directivas
Get-WUSettings
Set-WUSettings -SetActiveHours -ActiveHoursStart 7 -ActiveHoursEnd 19 -Confirm:$false
Set-WUSettings tiene 66 parámetros, y su código escribe en HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate y en su subclave AU. Son las mismas claves que las directivas de grupo. Por eso, en un equipo del dominio, la próxima actualización de directivas puede pisar lo que escriba el comando. En empresas, configure Windows Update con directivas de grupo o con Intune, y deje Set-WUSettings para equipos sueltos.
Un detalle que da error: los valores de -NotificationLevel van en inglés y con espacios, como 'Notify before download'. Con NotifyBeforeDownload el comando falla.
Respecto a las horas activas, Microsoft explica que de fábrica son de 8:00 a 17:00 y que el intervalo máximo es de 18 horas en las versiones posteriores a Windows 10 1607. En el equipo de prueba estaban de 6:00 a 0:00, es decir, las 18 horas.
Windows Update con PowerShell en equipos remotos
Aquí está la limitación que más confunde. La API de Windows Update deja buscar desde otro equipo, pero no descargar ni instalar: CreateUpdateDownloader y CreateUpdateInstaller no están disponibles para quien llama de forma remota. Por eso:
Get-WindowsUpdate -ComputerName SRV-01sirve para consultar.- Para instalar, el módulo crea una tarea programada en el equipo remoto con
Invoke-WUJob, que se ejecuta como SYSTEM. - La ayuda del módulo lo explica: desde un equipo remoto, esos métodos devuelven «Acceso denegado» (E_ACCESSDENIED, 0x80070005), aunque la búsqueda sí funcione.
Invoke-WUJob -ComputerName SRV-01, SRV-02 -Script 'Import-Module PSWindowsUpdate; Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot | Out-File C:\Windows\Temp\PSWindowsUpdate.log' -RunNow -Confirm:$false
Get-WUJob -ComputerName SRV-01, SRV-02
PSWindowsUpdate tiene que estar instalado en cada servidor, y el firewall tiene que permitir la administración remota de tareas programadas. La tarea se llama PSWindowsUpdate de fábrica.
Cuidado con Enable-WURemoting
El módulo trae Enable-WURemoting para abrir el firewall. No lo ejecutamos, pero leímos las órdenes que lleva su DLL:
- crea reglas de firewall para los puertos dinámicos de RPC;
- activa la administración remota de PowerShell y pone la lista
TrustedHostsen*, es decir, confiar en cualquier equipo; - pasa el Registro remoto a inicio automático y lo arranca;
- con
-LocalAccountTokenFilterPolicy, quita a las cuentas locales la restricción de UAC en las conexiones remotas.
Por lo tanto, varias de esas acciones debilitan la seguridad del servidor. En un dominio, abra solo las reglas que necesite con una directiva de grupo, y use la administración remota con PowerShell que ya tenga configurada.
Reparar Windows Update con PowerShell
Cuando Windows Update no busca, no descarga o repite el mismo error, reparar Windows Update con PowerShell tiene un orden recomendado, de lo menos a lo más invasivo:
- Reiniciar el equipo, porque muchas instalaciones esperan un reinicio pendiente.
- Revisar el error concreto en el historial o en el registro, como se explica más abajo.
- Reparar el almacén de componentes con DISM y sfc.
- Solo si nada de eso funciona, restablecer los componentes de Windows Update.
Reparar el almacén de componentes con DISM y sfc
En una consola elevada:
DISM.exe /Online /Cleanup-Image /RestoreHealth
sfc.exe /scannow
Es la solución que da Microsoft para errores como 0x800f081f, que significa que falta el origen de un componente. Explicamos las dos herramientas en nuestra guía de comandos CMD.
Qué hace Reset-WUComponents
Reset-WUComponents automatiza el restablecimiento manual que describe Microsoft, pero hace más cosas. Leímos su código paso a paso:
| Paso | Qué hace | ¿Lo pide Microsoft? |
|---|---|---|
| 1 | Detiene BITS, Windows Update, Identidad de aplicación y Servicios de cifrado | Sí, salvo Identidad de aplicación |
| 2 | Borra los archivos qmgr*.dat de BITS | Sí |
| 3 | Renombra SoftwareDistribution y Catroot2 | Sí, en un segundo intento |
| 4 | Borra WindowsUpdate.log | No |
| 5 | Reescribe los permisos de BITS y de Windows Update | Solo como último recurso, y con otros valores |
| 6 | Vuelve a registrar 36 DLL con regsvr32 | Sí |
| 7 | netsh winsock reset | Sí |
| 8 | netsh winhttp reset proxy | No |
| 9 y 10 | Arranca los servicios y lanza wuauclt /resetauthorization /detectnow | Arrancar los servicios, sí |
Lo que conviene saber antes de ejecutar Reset-WUComponents
Por todo ello, hay tres consecuencias que conviene conocer antes de ejecutarlo:
- Borra el proxy de WinHTTP. Si el equipo sale a internet por un proxy configurado con
netsh winhttp, Windows Update dejará de conectar. Antes, anote la salida denetsh winhttp show proxy. - Reescribe los permisos de los servicios. Microsoft pide saltarse ese paso salvo que los demás no funcionen; el módulo lo ejecuta siempre y con un descriptor de seguridad distinto del que publica Microsoft.
- Se lleva la caché. Al renombrar
SoftwareDistribution, Windows vuelve a descargar lo pendiente. En el equipo de prueba, la carpeta de descargas tenía 766 archivos y 652,2 MB.
Además, el paso final usa wuauclt /detectnow, que Microsoft dio por retirado. Si va a restablecer, guarde antes el historial y el registro, como en el escenario 6, y reinicie al terminar.
Leer el registro con Get-WindowsUpdateLog
Desde Windows 10, en cambio, Windows Update ya no escribe un archivo de texto: guarda trazas .etl en C:\Windows\Logs\WindowsUpdate. Get-WindowsUpdateLog, que viene con Windows, las convierte en un archivo legible:
Get-WindowsUpdateLog -LogPath "$env:TEMP\WindowsUpdate.log"
Select-String -Path "$env:TEMP\WindowsUpdate.log" -Pattern 'FATAL|0x8024' | Select-Object -Last 20
Medido: funcionó sin elevar, en 24,9 s con PowerShell 7 y 17,2 s con 5.1. Convirtió 79 trazas (unos 27 MB) en un archivo de 11 MB y unas 71.500 líneas. Además, el archivo es una copia fija: no se actualiza solo, y hay que volver a generarlo para ver lo nuevo. Sin -LogPath, lo deja en el escritorio.
Errores frecuentes de Windows Update
Estos son los códigos más habituales, con su significado según la referencia de Microsoft. Los tres primeros salieron en el equipo de prueba:
| Código | Qué significa | Qué hacer |
|---|---|---|
| 0x80240034 | La actualización no se pudo descargar | Revisar la conexión y el proxy, y reintentar; en el equipo de prueba falló 13 veces seguidas la misma acumulativa |
| 0x80242016 | Estado inesperado después del reinicio | Reiniciar otra vez y volver a buscar |
| 0x80240016 | Ya había otra instalación en curso o un reinicio obligatorio pendiente | Reiniciar y repetir |
| 0x80070422 | El servicio de Windows Update está deshabilitado | Ponerlo de nuevo en inicio manual |
| 0x8024402C | No se resuelve el nombre del servidor o del proxy | Revisar el DNS y el proxy |
| 0x80072EFE o 0x80072EFD | Tiempo de espera agotado | Revisar el firewall y el proxy |
| 0x800f081f | Falta el origen de un componente | DISM con /RestoreHealth y luego sfc |
| 0x80240020 | No hay ningún usuario con la sesión iniciada | Iniciar sesión y dejar reiniciar |
| 0x800704C7 | El usuario canceló la operación | Volver a lanzar la instalación |
El último también salió en el equipo de prueba, con la actualización preliminar de octubre. Para ver los códigos de un equipo, use el escenario 4.
Escenarios de Windows Update con PowerShell
Los seis escenarios se pueden copiar tal cual. Los que instalan, desinstalan o reparan necesitan una consola elevada; los de consulta, no.
Escenario 1: inventario de actualizaciones pendientes en varios servidores
Para empezar, este escenario no necesita PSWindowsUpdate en los servidores. Usa la API de Windows por COM dentro de Invoke-Command, porque buscar sí está permitido así. Además, guarda un CSV que Excel abre con las tildes bien:
$servidores = 'SRV-01', 'SRV-02', 'SRV-03'
$informe = Invoke-Command -ComputerName $servidores -ScriptBlock {
$buscador = (New-Object -ComObject Microsoft.Update.Session).CreateUpdateSearcher()
$pendientes = $buscador.Search("IsInstalled=0 and IsHidden=0 and Type='Software'").Updates
[pscustomobject]@{
Pendientes = $pendientes.Count
Titulos = ($pendientes | ForEach-Object { $_.Title }) -join ' | '
UltimaInstalacion = (New-Object -ComObject Microsoft.Update.AutoUpdate).Results.LastInstallationSuccessDate
ReinicioPendiente = Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
}
}
$lineas = $informe | Select-Object PSComputerName, Pendientes, UltimaInstalacion, ReinicioPendiente, Titulos | ConvertTo-Csv -NoTypeInformation -Delimiter ';'
[IO.File]::WriteAllLines("$env:USERPROFILE\Desktop\pendientes.csv", [string[]]$lineas, [Text.UTF8Encoding]::new($true))
Invoke-Command consulta los servidores en paralelo. Cuente con unos 35 s por búsqueda, que es lo que tardó en el equipo de prueba, y recuerde que la fecha de la última instalación viene en UTC. La configuración de la administración remota está en nuestra guía de PowerShell remoto.
Escenario 2: instalar de noche solo seguridad y críticas
Guarde este script y prográmelo como tarea de SYSTEM, como explicamos en tareas programadas con PowerShell:
Import-Module -Name PSWindowsUpdate
$registro = 'C:\Windows\Temp\PSWindowsUpdate-{0:yyyyMMdd}.log' -f (Get-Date)
Install-WindowsUpdate -MicrosoftUpdate -UpdateType Software -Category 'Security Updates', 'Critical Updates' -AcceptAll -IgnoreReboot -Verbose *>&1 | Out-File -FilePath $registro
if (Get-WURebootStatus -Silent) { Restart-Computer -Force }
-UpdateType Software deja fuera los controladores, y el reinicio solo ocurre si alguna actualización lo pide. Recuerde además que una tarea programada no arranca de fábrica con el portátil en batería; lo medimos en la guía de tareas programadas.
Escenario 3: diagnóstico rápido de un equipo que no actualiza
Estas órdenes no cambian nada y casi todas funcionan sin elevar:
Get-Service -Name wuauserv, bits, cryptsvc, UsoSvc | Select-Object Name, Status, StartType
(New-Object -ComObject Microsoft.Update.AutoUpdate).Results
Get-WinEvent -FilterHashtable @{ LogName = 'System'; ProviderName = 'Microsoft-Windows-WindowsUpdateClient'; Id = 20 } -MaxEvents 10 -ErrorAction SilentlyContinue | Select-Object TimeCreated, Message
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' -ErrorAction SilentlyContinue
Test-Path -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
Así se leen:
- Servicio
wuauservdetenido y en inicio manual: es normal, porque arranca cuando se necesita. Lo vimos detenido en una lectura y en marcha en la siguiente. En cambio, si está deshabilitado, ahí está el problema. - Últimas fechas correctas: si son de hace semanas, el equipo no está buscando. Están en UTC.
- Evento 20: cada instalación fallida, con su código. En el equipo de prueba había 4 entre los últimos 384 eventos de Windows Update; la guía del Visor de eventos explica cómo leerlos.
- Directivas: si existe la clave y trae
WUServer, el equipo depende de un servidor WSUS. - Reinicio pendiente: si da
True, reinicie antes de cualquier otra cosa.
Escenario 4: actualizaciones fallidas del último mes, en hora local
$desde = (Get-Date).AddDays(-30)
Get-WUHistory | Where-Object { $_.Result -eq 'Failed' -and $_.Date.ToLocalTime() -ge $desde } |
Select-Object @{ n = 'Fecha'; e = { $_.Date.ToLocalTime() } }, @{ n = 'Codigo'; e = { '0x{0:X8}' -f $_.HResult } }, KB, Title
Funciona sin elevar. Luego, con el código en hexadecimal, busque la fila en la tabla de errores de arriba.
Escenario 5: instalar una actualización urgente en varios servidores
$servidores = 'SRV-01', 'SRV-02'
Invoke-WUJob -ComputerName $servidores -Script 'Import-Module PSWindowsUpdate; Install-WindowsUpdate -KBArticleID KB5083631 -AcceptAll -IgnoreReboot | Out-File C:\Windows\Temp\PSWindowsUpdate-KB.log' -RunNow -Confirm:$false
Get-WUJob -ComputerName $servidores
Get-WURebootStatus -ComputerName $servidores
Después, cuando la tarea termine, revise el archivo de registro en cada servidor y reinícielos en la ventana acordada.
Escenario 6: guardar el historial y el registro antes de reparar
Antes de reparar Windows Update con Reset-WUComponents, guarde primero lo que el restablecimiento puede borrar:
$carpeta = "C:\Temp\WU-{0:yyyyMMdd-HHmm}" -f (Get-Date)
New-Item -ItemType Directory -Path $carpeta -Force | Out-Null
Get-WUHistory | Select-Object @{ n = 'Fecha'; e = { $_.Date.ToLocalTime() } }, Result, KB, Title | Export-Clixml -Path "$carpeta\historial.xml"
Get-WindowsUpdateLog -LogPath "$carpeta\WindowsUpdate.log"
netsh.exe winhttp show proxy | Out-File -FilePath "$carpeta\proxy.txt"
Así, tendrá con qué comparar, y el proxy de WinHTTP para volver a ponerlo si hace falta.
Windows Update desde CMD o PowerShell: usoclient y wuauclt
Mucha gente busca cómo forzar Windows Update desde CMD. Sin embargo, ninguna de las dos órdenes de antes es una buena opción:
wuauclt /detectnowestá retirado según Microsoft.usoclient.exeestá en el Windows 11 que medimos, pero Microsoft no documenta sus órdenes, comousoclient StartScan, ni garantiza que sigan funcionando.
Para pedir una búsqueda sin módulos, Microsoft propone en su lugar la API por COM, que se puede lanzar desde CMD a través de PowerShell:
powershell.exe -NoProfile -Command "(New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()"
Lo probamos en las dos versiones, sin elevar, y terminó sin error. Y para abrir la página de Windows Update de Configuración: start ms-settings:windowsupdate.
Errores comunes de Windows Update con PowerShell
| Mensaje | Causa | Solución |
|---|---|---|
| «To perform operations you must run an elevated Windows PowerShell console.» | Consola sin elevar | Abrir PowerShell como administrador |
| «Error en la comprobación de AuthorizationManager» al cargar | Directiva Restricted o AllSigned | Usar RemoteSigned para su usuario |
| «No match was found for the specified search criteria» al instalar | TLS, proveedor NuGet o repositorio | Ver la guía de módulos de PowerShell |
| «Install-WindowsUpdate» no se reconoce | Módulo sin cargar, o versión 1.x, que usaba Get-WUInstall | Import-Module PSWindowsUpdate y actualizar a la 2.2.1.5 |
| «Acceso denegado. (0x80070005 (E_ACCESSDENIED))» | Get-WUJob sin elevar, o instalar desde otro equipo sin tarea programada | Elevar, o usar Invoke-WUJob |
«No se puede validar el argumento en el parámetro NotificationLevel» | Valor sin espacios | 'Notify before download', en inglés y con espacios |
-Category 'Actualizaciones de seguridad' no encuentra nada | Categorías en español | Escribirlas en inglés: 'Security Updates' |
| La consola se cierra sin mensaje después de mostrar el historial | Get-WUHistory seguido de Select-Object -First | Usar Get-WUHistory -Last 20 |
Recomendaciones para actualizar Windows con PowerShell
Estas son, en resumen, las prácticas que recomendamos tras la prueba:
- Pruebe primero en un grupo pequeño de equipos. Microsoft publica la actualización de seguridad el segundo martes de cada mes, y la versión preliminar opcional del mes anterior sirve, según Microsoft, para validar antes.
- Use
-IgnoreRebooty reinicie en una ventana acordada, en lugar de-AutoRebooten horario laboral. - Fije
-UpdateType Softwaresi no quiere que Windows Update cambie controladores sin aviso. - No confíe en
Get-HotFixpara saber qué está instalado; useGet-WUHistory. - Convierta las fechas a hora local con
ToLocalTime()antes de comparar o informar, y no pongaSelect-Object -Firstdetrás deGet-WUHistory: use-Last. - Guarde un registro de cada instalación en un archivo con fecha.
- Revise
Reset-WUComponentsyEnable-WURemotingantes de usarlos: el primero borra el proxy de WinHTTP y el segundo debilita la seguridad del servidor. - No deje la configuración en
Set-WUSettingsen equipos del dominio: use directivas de grupo o Intune. - Tenga en cuenta que el módulo no es de Microsoft y no publica versiones desde julio de 2024. Para tareas de solo lectura, la API por COM no depende de nadie.
Lo que medimos y lo que no
Medimos en un Windows 11 Pro 26H2 (compilación 26300.9711, en español), sin permisos de administrador, con Windows PowerShell 5.1.26100 y PowerShell 7.6.9:
- la descarga de PSWindowsUpdate 2.2.1.5, su manifiesto, su firma y sus comandos;
- la carga con cada directiva de ejecución;
- lo que responde cada comando sin elevar;
- la búsqueda por COM, el historial frente a
Get-HotFix, la zona horaria de las fechas en cada versión y el cierre de la sesión conSelect-Object -First; Get-WindowsUpdateLogy los eventos de Windows Update;- las órdenes que contiene la DLL para
Reset-WUComponents,Enable-WURemotingySet-WUSettings.
Además, comprobamos los comandos de Windows Update con PowerShell y los parámetros del artículo contra el módulo en las dos versiones de PowerShell. Lo descargado se borró al terminar, y el equipo quedó como estaba.
En cambio, no instalamos, ocultamos ni desinstalamos ninguna actualización, ni ejecutamos Reset-WUComponents, Enable-WURemoting, Set-WUSettings ni Invoke-WUJob. Tampoco probamos WSUS ni equipos remotos: lo que no medimos sale de la ayuda del módulo y de la documentación de Microsoft.
Preguntas frecuentes
¿PSWindowsUpdate es un módulo de Microsoft?
No. Lo publica Michal Gajda en la Galería de PowerShell, firmado con su certificado. Microsoft no lo mantiene ni le da soporte.
¿Cómo forzar Windows Update desde PowerShell?
Con PSWindowsUpdate, en una consola elevada: Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot. Sin el módulo, (New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow() pide a Windows que busque, y Windows instalará según su configuración.
¿PSWindowsUpdate funciona en PowerShell 7?
Sí. Aunque el manifiesto solo declara la edición de Windows PowerShell 5.1, en PowerShell 7.6.9 cargó en 0,3 s con los mismos 28 comandos y respondió igual.
¿Se puede actualizar Windows con PowerShell sin permisos de administrador?
No. Sin elevar, solo se pueden consultar el historial, la última búsqueda y los orígenes de actualizaciones. Buscar, instalar o reiniciar con el módulo exige elevar.
¿Windows Update con PowerShell sirve en Windows Server?
Sí. PSWindowsUpdate y la API por COM también se usan en Windows Server, aunque nosotros solo lo medimos en Windows 11. En servidores, sin embargo, conviene usar -IgnoreReboot y reiniciar en la ventana de mantenimiento acordada.
¿Sirve PSWindowsUpdate en un equipo que depende de WSUS?
Sí: usa el origen predeterminado del equipo, que en ese caso es el servidor WSUS. Para buscar directamente en internet, use -MicrosoftUpdate. Y tenga en cuenta que Microsoft ya no desarrolla WSUS, aunque mantiene sus funciones.
Windows Update con PowerShell en la empresa
Actualizar un equipo con Windows Update con PowerShell es fácil. Lo difícil, en cambio, es saber cada mes qué equipos quedaron sin la actualización de seguridad, cuáles esperan un reinicio y cuál dejó de buscar hace semanas. En KHARONTE mantenemos los equipos de nuestros clientes dentro del mantenimiento preventivo y correctivo de nuestro soporte técnico para empresas, atendido desde nuestra mesa de ayuda TI y como parte de los servicios administrados de TI que prestamos. Si quiere conocer el resto de nuestros servicios de TI para empresas, escríbanos.




