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.
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)
- Confronta dimensioni e hash dell’
Export.cab/.gztra sorgente e destinazione. Se differiscono, la copia è danneggiata. - Decomprimi e ispeziona il
metadata.xml: deve chiudersi con</ExportPackage>. - Verifica versione WSUS e patch level su entrambi i server (stessa build WSUS 10.x su Windows Server 2022, cumulative aggiornate).
- Controlla spazio libero su
%ProgramFiles%\Update Servicese sul volume del DB. - Ri‑indicizza lo stato di WSUS se hai già avuto import falliti:
wsusutil reset.
Tabella di riferimento rapido
| Verifica | Spiegazione operativa |
|---|---|
| Integrità del pacchetto | Rigenera 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 WSUS | Entrambi i server devono avere la stessa build (WSUS 10.0 su Windows Server 2022) e le cumulative più recenti (es. KB5033323+). |
| Spazio temporaneo | Garantisci spazio libero nel volume che ospita %ProgramFiles%\Update Services; l’import decomprime i file prima di scriverli nel DB. |
Verifica manuale di metadata.xml | Decomprimi il .gz e verifica che termini con </ExportPackage>; se manca, il file è corrotto. |
| Antivirus/Proxy SMB | Scansioni 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 fallimento | Reindicizza i metadati e pulisce stati inconsistenti prima di ritentare l’import. |
Procedura collaudata end‑to‑end
Preparazione sul server sorgente (connesso)
- Pulizia: esegui la “Server Cleanup” (declina superseded/obsolete, scade le revisioni vecchie) per ridurre il volume.
- Sincronizza e assicurati che lo stato aggiornamenti sia “Up to date”.
- Esporta i metadati:
cd "C:\Program Files\Update Services\Tools" wsusutil.exe export D:\WSUSExport\Export.cab D:\WSUSExport\Export.logIn alcune installazioni può essere generato unmetadata.xml.gzall’interno o a fianco della CAB. - Calcola l’hash (per integrità):
PowerShell Get-FileHash D:\WSUSExport\Export.cab -Algorithm SHA256 Get-FileHash D:\WSUSExport\metadata.xml.gz -Algorithm SHA256 - Copia contenuto (opzionale ma consigliato se vuoi pre‑popolare i file binari): copia
WsusContentmantenendo 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)
- 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 - 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 - Esclusioni AV: escludi temporaneamente le cartelle WSUS (
%ProgramFiles%\Update Services\*) e la cartella di staging in cui copierai l’export. - 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 - Convalida hash su destinazione:
PowerShell Get-FileHash D:\WSUSImport\Export.cab -Algorithm SHA256 Get-FileHash D:\WSUSImport\metadata.xml.gz -Algorithm SHA256Confronta gli hash con quelli calcolati sul sorgente.
Importazione corretta
- Stop temporaneo di IIS (riduce lock e I/O durante l’import):
iisreset /stop - 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.logSe disponi dimetadata.xml.gzcome file autonomo supportato dalla tua build, usalo al posto della CAB. - Riattiva IIS:
iisreset /start - Verifica in console WSUS: numero di aggiornamenti, categorie, linguaggi; controlla “Last Synchronization” (deve riferirsi all’import).
Se l’import fallisce: percorso di recupero
- Rimuovi lo stato sporco:
wsusutil.exe resetAttendi il completamento; questo step reindicizza metadati e corregge inconsistenze leggere. - Controlla i log:
D:\WSUSImport\Import.log(o percorso scelto durante l’import).- Event Viewer → Applications and Services Logs → Microsoft → Windows → WindowsUpdateServer.
%ProgramFiles%\Update Services\LogFiles\SoftwareDistribution.log(se presente).
- Decomprimi e ispeziona il metadata:
expand.exe -F:* D:\WSUSImport\Export.cab D:\WSUSImport\ExtractedOppure, per.gz, usa lo script PowerShell qui sotto per estrarre e convalidare. - Ricrea l’export sul sorgente e ricopia con
robocopy /ZBse qualsiasi verifica fallisce. - 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")) {
& "$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 "</ExportPackage>"
$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
SUSDBe 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)
- Sul sorgente: cleanup → export → calcolo hash → copia con robocopy.
- Sulla destinazione: convalida hash → stop IIS → import → start IIS.
- 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.exesu 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.gzsu 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.
