Automazione del WSUS CleanUp

imageGrazie a PowerShell è possibile automatizzare semplicemente anche una delle operazioni amministrative che normalmente venivano svolte manualmente con cadenza periodica (leggi quando ci si ricorda) dagli amministratori di sistema, ovvero il wizard della pulizia guidata di WSUS.

image

L’idea è quella di sfruttare tramite PowerShell la classe CleanupScope contenuta in Microsoft.UpdateServices.Administration.dll che a sua volta non è altro che un assembly .NET.

image

image

Di conseguenza risulta semplice utilizzare la classe sfruttando la tecnica della Reflection per ottenere un’istanza della classe CleanupScope:

[reflection.assembly]::LoadWithPartialName(“Microsoft.UpdateServices.Administration”)
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer()
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope

Di fatto questo assembly consente una totale automazione delle varie operazioni eseguite tramite la console di WSUS, per un approfondimento si veda Use PowerShell to Perform Basic Administrative Tasks on WSUS.

Tornando all’automazione del CleanUp di WSUS è possibile specificare quali operazioni eseguire:

# Eliminazione aggiornamenti scaduti e eliminazione delle revisioni obsolete
$cleanupScope.CleanupObsoleteUpdates = $TRUE
$cleanupScope.CompressUpdates = $TRUE

# Eliminazione Computer obsoleti
$cleanupScope.CleanupObsoleteComputers = $TRUE

# Eliminazione file di aggiornamento non necessari
$cleanupScope.CleanupUnneededContentFiles = $TRUE

# Rifiuto aggiornamenti scaduti
$cleanupScope.DeclineExpiredUpdates = $TRUE

# Rifiuto aggiornamenti sostituiti
$cleanupScope.DeclineSupersededUpdates = $TRUE

Impostate le opzioni di CleanUp non rimane che eseguire l’operazione:

$cleanupManager = $wsus.GetCleanupManager()
$cleanupManager.PerformCleanup($cleanupScope)

Per eseguire i comandi PowerShell occorre, come sempre impostare prima l’Execution Policy almeno a RemoteSigned tramite il comando che va eseguito in una shell PowerShell aperta con privilegi amministrativi:

Set-ExecutionPolicy RemoteSigned

Per schedulare l’attività basta creare ad esepio in C:\Scripts il seguente file cmd che richiamerà lo script PowerShell e che verrà quindi eseguito con un’operazione pianificata:

File WSUS-CleanUp.cmd

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe C:\Scripts\WSUS-CleanUp.ps1

Di seguito invece il contenuto del file WSUS-CleanUp.ps1 che eseguirà il CleanUp e riporterà l’esito nel file WSUS-CleanUp-Log.txt:

File WSUS-CleanUp.ps1

$logFilePath = ‘.\WSUS-CleanUp-Log.txt’
 
[reflection.assembly]::LoadWithPartialName(“Microsoft.UpdateServices.Administration”)
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer()
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope

# Eliminazione aggiornamenti scaduti e eliminazione delle revisioni obsolete
$cleanupScope.CleanupObsoleteUpdates = $TRUE
$cleanupScope.CompressUpdates = $TRUE

# Eliminazione Computer obsoleti
$cleanupScope.CleanupObsoleteComputers = $TRUE

# Eliminazione file di aggiornamento non necessari
$cleanupScope.CleanupUnneededContentFiles = $TRUE

# Rifiuto aggiornamenti scaduti
$cleanupScope.DeclineExpiredUpdates = $TRUE

# Rifiuto aggiornamenti sostituiti
$cleanupScope.DeclineSupersededUpdates = $TRUE

$cleanupManager = $wsus.GetCleanupManager()
$cleanupManager.PerformCleanup($cleanupScope) | Out-File -FilePath $logFilePath

Di seguito un esempio dell’output ottenuto:

image

Questo approccio funziona tranquillamente anche su sistemi Windows Server 2003 Sp2 con WSUS 3.0 Sp2 basta infatti installare Windows PowerShell 2.0 e WinRM 2.0 per Windows Server 2003 (KB968930) e il .NET Framework 2.0 o successivo (è consigliabile installare anche il Service Pack2 del :NET Framework e le successive hotfix), per ulteriori informazioni si veda Windows PowerShell System Requirements.

Come si può leggere nel seguente Introduction to PoshWSUS, a Free PowerShell Module to Manage WSUS per WSUS è stato sviluppato PoshWSUS, un modulo PowerShell scritto da Boe Prox che l’ha reso disponibile su CodePlex al seguente http://poshwsus.codeplex.com/. Grazie a tale modulo è possibile utilizzare i 60 comandi in esso contenuti per automatizzare WSUS.

In Windows Server 2012 sono stati introdotti i cmdlets PowerShell per WSUS tra cui Invoke-WsusServerCleanup di conseguenza per eseguire il CleanUp basta eseguire il seguente comando PowerShell:

Get-WsusServer | Invoke-WsusServerCleanup -CleanupObsoleteUpdates –CompressUpdates –CleanupObsoleteComputers –CleanupUnneededContentFiles –DeclineExpiredUpdates -DeclineSupersededUpdates

Quindi in Windows Server 2012 il file WSUS-CleanUp.ps1 può essere semplificato come segue:

File WSUS-CleanUp.ps1

$logFilePath = ‘.\WSUS-CleanUp-Log.txt’

Get-WsusServer | Invoke-WsusServerCleanup -CleanupObsoleteUpdates –CompressUpdates –CleanupObsoleteComputers –CleanupUnneededContentFiles –DeclineExpiredUpdates –DeclineSupersededUpdates | Out-File -FilePath $logFilePath