Wsus - errori di sincronizzazione client

Come già indicato in post precedenti, capita spesso di incontrare problematiche di sincronizzazione dei client verso il server Wsus.
Il problema si risolve manualmente quando il numero di client è limitato, ma quando i client cominciano ad essere tanti la cosa diventa dispersiva e logorante.

Occorre quindi trovare una soluzione veloce, alla portata di tutti e completa in modo da racchiudere il più alto numero di casistiche.

Riporto quindi una procedura che fa tutto da se:
  • riregistra le DLL utilizzate dagli aggiornamenti automatici
  • resetta i permessi corretti dei servizi Wuauserv e Bits (NOTA: Wuauserv lo settiamo con avvio MANUAL)
  • arresta i servizi sopra citati
  • cancella la cartella SoftwareDistribution
  • riavvia i servizi



NOTA: la cancellazione della cartella SoftwareDistribution è consigliabile solo qualora il client non si sia mai sincronizzato correttamente col server. Se questo è già avvenuto è consigliabile non rimuoverla. E' comunque fisiologico ripetere l'operazione di sincronizzazione 2 o 3 volte prima che riparta il tutto.

Script da copiare in un file di testo con estensione VBS:

Option Explicit
On error resume next
Dim objWMIService    'continene moniker per query WMI
Dim colServiceList   'Collection con elenco servizi
Dim objFSO           'Per creare oggetto FileSystem
Dim windir           'per caricare la cartella di windows
Dim WshShell         'Per creare oggetto Shell
Dim strComputer      'Assume il valore del computer locale
Dim objService       'Oggetti nella collection
Dim prova    'Oggetti per ritardare l'esecuzione della riga di comando

strComputer = "."
Set WshShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set windir = objfso.GetSpecialFolder(0)


'Riregistro DLL per gli aggiornamenti automatici
prova = WshShell.Run ("regsvr32 " & "%windir%\system32\wuapi.dll /s",0,true)
prova = WshShell.Run ("regsvr32 " & "%windir%\system32\wuaueng1.dll /s",0,true)
prova = WshShell.Run ("regsvr32 " & "%windir%\system32\wucltui.dll /s",0,true)
prova = WshShell.Run ("regsvr32 " & "%windir%\system32\wups.dll /s",0,true)
prova = WshShell.Run ("regsvr32 " & "%windir%\system32\wups2.dll /s",0,true)
prova = WshShell.Run ("regsvr32 " & "%windir%\system32\wuweb.dll /s",0,true)
WshShell.Run ("%windir%\system32\sc sdset wuauserv ""D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)"""),0
WshShell.Run ("%windir%\system32\sc sdset bits ""D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)"""),0
prova = WshShell.Run ("regsvr32 " & "%windir%\system32\wuaueng.dll /s",0,true)
WshShell.Run ("%windir%\system32\sc config wuauserv start= demand"),0

'Arresto servizi Wuauser e Bits
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery ("Select * from Win32_Service where Name = 'wuauserv' or name = 'bits'")
For each objService in colServiceList
 REM Wscript.echo objService.name
 objService.StopService()
Next

'Cancello cartella software distribution e tutto il suo contenuto
objFSO.DeleteFolder(windir & "\softwaredistribution")

'Riavvio servizi Wuauser e Bits
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery ("Select * from Win32_Service where Name = 'bits'")
For each objService in colServiceList
 REM Wscript.echo objService.name
 objService.startservice()
Next