Para parchear equipos con de windows podemos usar diversas alternativas
Lo mejor es utilizar un servidor como WSUS . Configuramos mediante una GPO para indicar el servidor local donde deben de conectarse los clientes y verificamos el acceso de los mismos al servidor por los puerto 8530 y 8531.
Si tenemos equipos que no pertenecen al dominio pero queremos que se actualizen desde el servidor WSUS debemos de hacer lo siguiente:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate] "WUServer"="http://ipservidorwsus:8530" "WUStatusServer"="ipservidorwsus:8530" [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU] "NoAutoUpdate"=dword:00000000 "UseWUServer"=dword:00000001
Copiamos el fichero creado al equipo que queramos que se actualize. Pinchamos sobre el mismo dos veces para que nos añada los valores anteriores al registro del equipo.
Ejecutamos desde una ventana de comandos (cmd) lo siguiente
wuauclt.exe /reportnow /detectnowy deberíamos de ver el equipo en la lista de equipos clientes del servidor WSUS
wuauclt.exe /resetauthorization /detectnow
En las versiones de windows 10 y windows 2016 la utilidad wuauclt ha sido reemplazada por usoclient . Ahora para lanzar una búsqueda de actualizaciones desde windows 10, tendríamos que abrir una consola como administradory ejecutar
usoclient StartScanLas opciones que podemos usar con usoclient son :
Creamos el siguiente script de powershell y lo llamamos actualizar.ps1
$winVer = [System.Environment]::OSVersion.Version.Major $dir = 'C:\_Windows_FU\packages' mkdir $dir if ($winVer -eq 10) { $webClient = New-Object System.Net.WebClient $url = 'https://go.microsoft.com/fwlink/?LinkID=799445' $file = "$($dir)\Win10Upgrade.exe" $webClient.DownloadFile($url,$file) Start-Process -FilePath $file -ArgumentList '/quietinstall /skipeula /auto upgrade /copylogs $dir' } else { echo "This is Not Windows10 OS " } sleep 10 Remove-Item "C:\_Windows_FU" -Recurse -Force -Confirm:$false
Ojo el link $url hay que cambiarlo según el upgrade que queramos instalar
Para ejecutarlo powershell.exe -ExecutionPolicy Bypass ./actualizar.ps1
https://www.signalwarrant.com/force-wsus-checkin-with-powershell-2/
# *** THIS SCRIPT IS PROVIDED WITHOUT WARRANTY, USE AT YOUR OWN RISK *** <# .DESCRIPTION Starts the Windows Update service (wuauserv) if it is stopped and forces a checkin with the WSUS Server. This function uses the Invoke-Command CMDlet which will require PSRemoting to be enabled on the target machine. .NOTES File Name: force-WSUScheckin.ps1 Author: David Hall Contact Info: Website: www.signalwarrant.com Twitter: @signalwarrant Facebook: facebook.com/signalwarrant/ Google +: plus.google.com/113307879414407675617 YouTube Subscribe link: https://www.youtube.com/channel/UCgWfCzNeAPmPq_1lRQ64JtQ?sub_confirmation=1 Requires: PowerShell Remoting Enabled (Enable-PSRemoting) Tested: PowerShell Version 5 .PARAMETER ComputerName See the examples below, the computername can be one or many computer names .EXAMPLE .\force-WSUScheckin.ps1 -ComputerName CL1 .\force-WSUScheckin.ps1 -ComputerName CL1 -verbose .\force-WSUScheckin.ps1 -ComputerName CL1, CL2 -verbose .\force-WSUScheckin.ps1 -ComputerName (Get-Content -Path "C:\computers.txt") -verbose #> [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string[]]$ComputerName ) $service = get-service -Name wuauserv # Check to see if the wuauserv service is stopped if ($service.Status -eq "Stopped"){ # If the service is stopped we're going to start it and force WSUS checkin # then Exit Write-verbose "1. WUAUSERV is stopped... starting" Invoke-Command -ComputerName $ComputerName -scriptblock {Start-Service wuauserv} [System.Threading.Thread]::Sleep(3000) Write-verbose "2. Forcing WSUS Checkin" Invoke-Command -ComputerName $ComputerName -scriptblock {wuauclt.exe /detectnow} [System.Threading.Thread]::Sleep(1500) Write-verbose "3. Checkin Complete" Exit } else { # If the service is started we'll just force the WSUS checkin and Exit Write-verbose "1. Forcing WSUS Checkin" Invoke-Command -ComputerName $ComputerName -scriptblock {wuauclt.exe /detectnow} [System.Threading.Thread]::Sleep(1500) Write-Verbose "2. Checkin Complete" Exit }
Ejecutar desde powershell en el equipo ccon problemas →
$updateSession = new-object -com "Microsoft.Update.Session"; $updates=$updateSession.CreateupdateSearcher().Search($criteria).Updates
Forzar la sincronización mediante un script
Function Force-WSUSCheckin($Computer) { Invoke-Command -computername $Computer -scriptblock { Start-Service wuauserv -Verbose } # Have to use psexec with the -s parameter as otherwise we receive an "Access denied" message loading the comobject $Cmd = '$updateSession = new-object -com "Microsoft.Update.Session";$updates=$updateSession.CreateupdateSearcher().Search($criteria).Updates' & c:\bin\psexec.exe -s \\$Computer powershell.exe -command $Cmd Write-host "Waiting 10 seconds for SyncUpdates webservice to complete to add to the wuauserv queue so that it can be reported on" Start-sleep -seconds 10 Invoke-Command -computername $Computer -scriptblock { # Now that the system is told it CAN report in, run every permutation of commands to actually trigger the report in operation wuauclt /detectnow (New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow() wuauclt /reportnow c:\windows\system32\UsoClient.exe startscan } }
https://pleasework.robbievance.net/howto-force-really-wsus-clients-to-check-in-on-demand/
Si aún tenemos máquinas con windows xp que se tienen que actualizar desde el wsus y no están cogiendo las actualizaciones y aún poniendo el paquete de objetos para la versión del servidor (Group Policy Preference Client Side Extensions for Windows XP (KB943729) )sigue sin actualizar. Podemos mirar en la estación en c:\windows\WindowsUpdate.log para ver de donde vienen el problema.
Para resolverlo podemos cambiar los permisos de los servicios de actualizaciones automáticas (wuaserv) y el servicio de transferencia inteligente en segundo plano (Bits)
sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)
sc.exe sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)
Resetear la configuración del proxy (por ejemplo si nos descargamos los parches de un servidor wsus local)
netsh winhttp reset proxyo bien
netsh winhttp import proxy source=ie
Si sigue fallando probar con :
net stop bits net stop wuauserv reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate /f rd /s /q %WINDIR%\SoftwareDistribution gpupdate /force wuauclt /resetauthorization /detectnow
https://wuinstall.com/index.php/blog-list/item/11-force-windows-10-updates-command-line.html
Podemos abrir un terminal y ejecutar el wuauclt.exe con alguna de estas opciones:
Por ejemplo para actualizar la conexión de la estación al servidor de wsus
wuauclt.exe /resetauthorization /detectnow
Existe una página de Microsoft desde donde podemos bajarnos parches para un KB (Microsoft Knowledge Base) en particular.
Por ejemplo para bajar los parches para el famoso virus WannaCry → http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598