WSUS Windows Server 2022: importazione offline degli aggiornamenti e fix all’errore “Unexpected end of file”

Durante l’importazione offline degli aggiornamenti WSUS su Windows Server 2022 il comando wsusutil import può bloccarsi dopo alcuni minuti con l’errore “Unexpected end of file”. In questa guida trovi cause probabili, diagnosi operativa e una procedura collaudata per completare con successo l’import.

Indice

Scenario e sintomo

Su un server WSUS disconnesso (air‑gapped) stai importando metadati esportati da un WSUS “sorgente” connesso a Internet. Il comando è il classico:

wsusutil.exe import <Export.cab|Export.gz> <Import.log>

Dopo ~10 minuti l’operazione si interrompe con messaggi simili a:

Fatal error: Unexpected end of file has occurred.
The following elements are not closed: metadata, update, updates, ExportPackage…

Risultato: circa metà degli aggiornamenti risulta importata; i tentativi successivi falliscono sempre allo stesso punto.

Perché accade

L’errore segnala che il parser XML sta leggendo un file troncato o internamente incoerente (tag finali mancanti). In un contesto WSUS, le cause tipiche sono:

  • Pacchetto export corrotto o incompleto (copiato parzialmente o compresso male).
  • Disallineamento di versione/patch tra server sorgente e server di destinazione (schemi WSUS diversi).
  • Spazio insufficiente nell’area di lavoro di WSUS: durante l’import i file vengono decompressi e temporaneamente indicizzati prima della scrittura su database.
  • AV/EDR o proxy SMB che interferiscono con la copia, tagliando lo stream a metà.
  • Stati interni inconsistenti nel database SUSDB a seguito di un primo tentativo fallito (indici/relazioni non aggiornate).

Nota sull’unica risposta “ufficiale” nel thread

Nel thread originale l’unico intervento formale invitava a ripubblicare il caso nello spazio Microsoft Q&A dedicato a WSUS, dove rispondono tecnici specializzati. In pratica: se i passaggi di questa guida non risolvono, conviene aprire un nuovo quesito in quell’area allegando tutte le evidenze tecniche.

Checklist rapida di diagnosi (5 minuti)

  1. Confronta dimensioni e hash dell’Export.cab/.gz tra sorgente e destinazione. Se differiscono, la copia è danneggiata.
  2. Decomprimi e ispeziona il metadata.xml: deve chiudersi con </ExportPackage>.
  3. Verifica versione WSUS e patch level su entrambi i server (stessa build WSUS 10.x su Windows Server 2022, cumulative aggiornate).
  4. Controlla spazio libero su %ProgramFiles%\Update Services e sul volume del DB.
  5. Ri‑indicizza lo stato di WSUS se hai già avuto import falliti: wsusutil reset.

Tabella di riferimento rapido

VerificaSpiegazione operativa
Integrità del pacchettoRigenera l’export sul server origine con wsusutil.exe export e ricopia i file. Un file .gz troncato interrompe il parser XML.
Schema e patch di WSUSEntrambi i server devono avere la stessa build (WSUS 10.0 su Windows Server 2022) e le cumulative più recenti (es. KB5033323+).
Spazio temporaneoGarantisci spazio libero nel volume che ospita %ProgramFiles%\Update Services; l’import decomprime i file prima di scriverli nel DB.
Verifica manuale di metadata.xmlDecomprimi il .gz e verifica che termini con </ExportPackage>; se manca, il file è corrotto.
Antivirus/Proxy SMBScansioni in tempo reale o proxy di rete possono troncare la copia; usa robocopy /zb o disattiva temporaneamente la protezione durante il trasferimento.
wsusutil reset dopo un fallimentoReindicizza i metadati e pulisce stati inconsistenti prima di ritentare l’import.

Procedura collaudata end‑to‑end

Preparazione sul server sorgente (connesso)

  1. Pulizia: esegui la “Server Cleanup” (declina superseded/obsolete, scade le revisioni vecchie) per ridurre il volume.
  2. Sincronizza e assicurati che lo stato aggiornamenti sia “Up to date”.
  3. Esporta i metadati: cd "C:\Program Files\Update Services\Tools" wsusutil.exe export D:\WSUSExport\Export.cab D:\WSUSExport\Export.log In alcune installazioni può essere generato un metadata.xml.gz all’interno o a fianco della CAB.
  4. Calcola l’hash (per integrità): PowerShell Get-FileHash D:\WSUSExport\Export.cab -Algorithm SHA256 Get-FileHash D:\WSUSExport\metadata.xml.gz -Algorithm SHA256
  5. Copia contenuto (opzionale ma consigliato se vuoi pre‑popolare i file binari): copia WsusContent mantenendo ACL e timestamp. robocopy "D:\WSUS\WsusContent" "E:\WSUS\WsusContent" /MIR /COPYALL /DCOPY:T /R:3 /W:5 /MT:16 /XJ /TEE /LOG:WsusContentCopy.log

Preparazione sul server di destinazione (offline)

  1. Versione e patch: verifica che il WSUS sia la stessa release/patch del sorgente. Comando utile: PowerShell (Get-Item "C:\Program Files\Update Services\Tools\wsusutil.exe").VersionInfo.FileVersion
  2. Spazio: accertati di avere almeno il 30–50% di spazio libero sul volume di WSUS e su quello del database (WID/SQL). PowerShell Get-PSDrive C, D, E | Select-Object Name,Free,Used,Capacity
  3. Esclusioni AV: escludi temporaneamente le cartelle WSUS (%ProgramFiles%\Update Services\*) e la cartella di staging in cui copierai l’export.
  4. Copia sicura dell’export e, se previsto, di WsusContent: robocopy "\\SRV-Sorgente\WSUSExport" "D:\WSUSImport" Export.cab Export.log metadata.xml.gz /ZB /R:3 /W:5 /TEE /LOG:ExportCopy.log
  5. Convalida hash su destinazione: PowerShell Get-FileHash D:\WSUSImport\Export.cab -Algorithm SHA256 Get-FileHash D:\WSUSImport\metadata.xml.gz -Algorithm SHA256 Confronta gli hash con quelli calcolati sul sorgente.

Importazione corretta

  1. Stop temporaneo di IIS (riduce lock e I/O durante l’import): iisreset /stop
  2. Import con log verboso in una cartella dedicata: cd "C:\Program Files\Update Services\Tools" wsusutil.exe import D:\WSUSImport\Export.cab D:\WSUSImport\Import.log Se disponi di metadata.xml.gz come file autonomo supportato dalla tua build, usalo al posto della CAB.
  3. Riattiva IIS: iisreset /start
  4. Verifica in console WSUS: numero di aggiornamenti, categorie, linguaggi; controlla “Last Synchronization” (deve riferirsi all’import).

Se l’import fallisce: percorso di recupero

  1. Rimuovi lo stato sporco: wsusutil.exe reset Attendi il completamento; questo step reindicizza metadati e corregge inconsistenze leggere.
  2. Controlla i log:
    • D:\WSUSImport\Import.log (o percorso scelto durante l’import).
    • Event Viewer → Applications and Services LogsMicrosoftWindowsWindowsUpdateServer.
    • %ProgramFiles%\Update Services\LogFiles\SoftwareDistribution.log (se presente).
  3. Decomprimi e ispeziona il metadata: expand.exe -F:* D:\WSUSImport\Export.cab D:\WSUSImport\Extracted Oppure, per .gz, usa lo script PowerShell qui sotto per estrarre e convalidare.
  4. Ricrea l’export sul sorgente e ricopia con robocopy /ZB se qualsiasi verifica fallisce.
  5. Allinea versioni/patch: aggiorna entrambi i server alle stesse cumulative di Windows Server 2022 e riavvia.

Script PowerShell per convalida rapida dell’export

Lo script seguente decomprime un eventuale metadata.xml.gz (o estrae da CAB), verifica la presenza del tag finale </ExportPackage> e calcola l’hash dei file.

PowerShell
function Test-WsusExport {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string]$Path,
        [string]$OutDir = (Join-Path (Split-Path $Path) "Extracted")
    )
    New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
```
$metaPath = $null
if ($Path.ToLower().EndsWith(".cab")) {
    &amp; "$env:SystemRoot\System32\expand.exe" -F:* $Path $OutDir | Out-Null
    $metaPath = Get-ChildItem $OutDir -Recurse -Filter metadata.xml -File | Select-Object -First 1 | ForEach-Object FullName
} elseif ($Path.ToLower().EndsWith(".gz")) {
    $metaPath = Join-Path $OutDir "metadata.xml"
    $in = [IO.File]::OpenRead($Path)
    try {
        $gz = New-Object IO.Compression.GZipStream($in, [IO.Compression.CompressionMode]::Decompress)
        $out = [IO.File]::Create($metaPath)
        $gz.CopyTo($out)
        $gz.Dispose(); $out.Dispose()
    } finally { $in.Dispose() }
} else {
    throw "Estensione non riconosciuta. Usa .cab o .gz"
}

if (!(Test-Path $metaPath)) { throw "metadata.xml non trovato." }

$tail = Get-Content -Path $metaPath -Tail 5 -Raw
$ok = $tail -match "&lt;/ExportPackage&gt;"
$hash = Get-FileHash -Algorithm SHA256 -Path $Path

[PSCustomObject]@{
    File       = $Path
    SHA256     = $hash.Hash
    MetadataOK = $ok
    Metadata   = $metaPath
}
```
}

Allineamento versione WSUS e patch di sistema

Assicurati che:

  • Entrambi i server eseguano WSUS 10.x su Windows Server 2022.
  • Siano installate le stesse Latest Cumulative Update del sistema operativo (ad esempio “KB5033323 o successive”).
  • Siano attivi gli stessi product categories e languages (in caso di forti discrepanze possono emergere inconsistenze sui metadati).

Comandi utili:

PowerShell
Versione wsusutil (proxy per versione binari WSUS)
(Get-Item "C:\Program Files\Update Services\Tools\wsusutil.exe").VersionInfo

Chiavi di setup WSUS

Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Update Services\Server\Setup" |
Select-Object Version, WsusContentDir, SqlServerName, SqlDatabaseName

Spazio, prestazioni e stabilità

  • Spazio temporaneo: durante l’import WSUS usa spazio aggiuntivo per decompressione e staging dei metadati. Target consigliato: almeno 10–15 GB liberi per il solo import di metadati, molto di più se copi anche WsusContent.
  • DB WID/SQL: se usi WID, verifica la dimensione di SUSDB e la disponibilità di spazio nel volume dati/log. Su SQL Express/Standard imposta eventualmente un max memory coerente per evitare pressione sul file system.
  • IIS Application Pool: durante l’import puoi fermare IIS (iisreset /stop) per ridurre lock e log I/O; al termine riavvia.

Cause comuni e rimedi mirati

Pacchetto export corrotto

Sintomi: errore “Unexpected end of file”, metadata.xml privo del tag finale, hash diversi tra sorgente e destinazione.

Rimedio:

  • Rigenera l’export sul sorgente: wsusutil export.
  • Trasferisci con robocopy /ZB (modalità restartable/backup) e logga l’operazione.
  • Disattiva temporaneamente AV/EDR su entrambe le estremità o crea esclusioni per le cartelle coinvolte.
  • Verifica hash e integrità con lo script Test-WsusExport.

Disallineamento schema WSUS

Sintomi: errori non deterministici durante import, voci nel log che indicano mismatch di versione.

Rimedio: porta entrambi i server alla stessa build/patch; riavvia; riprova l’import.

Spazio insufficiente o I/O saturato

Sintomi: import che si ferma dopo alcuni minuti, dimensioni dei file di staging che non crescono, Event Log con warning di spazio.

Rimedio: libera spazio su %ProgramFiles%\Update Services e sul volume del DB; valuta di spostare il contenuto con wsusutil movecontent verso un disco più capiente prima di importare.

Stato WSUS incoerente dopo tentativi falliti

Sintomi: import parzialmente riuscito, errori diversi a ogni tentativo.

Rimedio: esegui wsusutil reset per reindicizzare e pulire; se necessario, riavvia il servizio WSUS e IIS.

Runbook operativo (copy&paste)

  1. Sul sorgente: cleanup → export → calcolo hash → copia con robocopy.
  2. Sulla destinazione: convalida hash → stop IIS → import → start IIS.
  3. Se fallisce: reset → verifica log → valida metadata.xml → ricrea export → riprova.

Comandi utili aggiuntivi

PowerShell
Spazio su dischi principali
Get-PSDrive -PSProvider FileSystem | Sort-Object Used -Descending |
 Select-Object Name, @{N="Free(GB)";E={[math]::Round($_.Free/1GB,1)}},
               @{N="Used(GB)";E={[math]::Round($_.Used/1GB,1)}},
               @{N="Capacity(GB)";E={[math]::Round($_.Capacity/1GB,1)}}

Eventi WSUS delle ultime 24 ore

Get-WinEvent -LogName "Microsoft-Windows-WindowsUpdateServer/Operational" -MaxEvents 200 |
Where-Object TimeCreated -gt (Get-Date).AddDays(-1) |
Select-Object TimeCreated, Id, LevelDisplayName, Message

Verifica rapida del tag finale nel metadata

Select-String -Path "D:\WSUSImport\Extracted\metadata.xml" -Pattern "" -SimpleMatch

Domande frequenti

L’import offline include anche i file binari degli aggiornamenti?
No, l’export/import trasferisce i metadati. Se vuoi pre‑posizionare anche i binari (.cab/.msu), copia la cartella WsusContent dal sorgente al target mantenendo struttura e permessi. In alternativa, lasciali scaricare al WSUS offline da una “sorgente di contenuto” interna, se presente.

Posso usare direttamente il metadata.xml non compresso?
Dipende dalla build: normalmente si specifica la CAB o il GZ generati dall’export. Per diagnosi puoi estrarre il metadata.xml, ma per l’import usa il contenitore così come prodotto dal comando di export.

Conviene fermare IIS durante l’import?
Non è obbligatorio, ma riduce il rumore di I/O e i lock sui file WSUS durante la fase più pesante.

Modello di richiesta di supporto (Q&A WSUS)

Se il problema persiste, apri il caso includendo tutte le seguenti informazioni per facilitare la diagnosi da parte di un ingegnere:

  • Versione dettagliata di wsusutil.exe su entrambi i server (file version e build OS).
  • Log completi dell’import con livello verboso (Import.log), estratti Event Viewer pertinenti.
  • Dimensioni precise di Export.cab/metadata.xml.gz su sorgente e destinazione, più SHA256 calcolati.
  • Elenco categorie/lingue abilitati e spazio libero sui volumi WSUS/DB.

Best practice finali per evitare ricadute

  • Allinea patch di sistema e WSUS su entrambi i lati prima di ogni ciclo di export/import.
  • Stabilisci una finestra di manutenzione dedicata all’import (niente scansioni AV, niente backup concorrenti sul volume WSUS).
  • Automatizza le verifiche (hash, tag finale del metadata, spazio su disco) con uno script PowerShell.
  • Documenta la catena di custodia dei file export (origine → supporto rimovibile → destinazione) per tracciare facilmente eventuali corruzioni.
  • Esegui periodicamente “Server Cleanup” per mantenere SUSDB piccolo e performante.

Riepilogo operativo

Nel 90% dei casi l’errore “Unexpected end of file” durante l’import WSUS è dovuto a un export troncato o corrotto. La soluzione pratica è: rigenerare l’export, ricopiarlo in modo affidabile (robocopy/backup mode), verificarne l’integrità (hash + tag di chiusura XML), quindi riallineare build/patch dei due server e ripetere l’import dopo un wsusutil reset. Se persiste, raccogli le evidenze e chiedi supporto nel canale WSUS Q&A.


Nota: Le procedure e i comandi qui riportati sono pensati per Windows Server 2022 con WSUS 10.x e database WID o SQL Server. Adattali alla tua infrastruttura rispettando le policy di sicurezza interne.

Se hai bisogno di uno script personalizzato per validare automaticamente export di grandi dimensioni o per orchestrare un import multi‑step, copia i blocchi PowerShell di questa guida e adattali ai tuoi percorsi.

Indice