Devi distribuire il language pack spagnolo es‑ES su molte VM Hyper‑V con Windows Server 2022? In questa guida trovi fonti ufficiali per ottenere il file lp.cab, script PowerShell pronti all’uso, varianti per installazioni offline/online e consigli operativi per un rollout sicuro e ripetibile.
Obiettivo e contesto
Molte organizzazioni richiedono server localizzati per team distribuiti o per applicazioni che espongono messaggi di sistema nella lingua degli operatori. La modalità più solida per Windows Server 2022 è utilizzare il language pack .cab es‑ES (spagnolo, Spagna) e distribuirlo via PowerShell. L’approccio con file .cab permette di lavorare anche in ambienti isolati (senza accesso a Internet) e di garantire uniformità di versione tra tutte le VM.
Cos’è il language pack .cab e perché usarlo
Il pacchetto lp.cab contiene le risorse di interfaccia utente (UI) per la lingua scelta. In Windows Server 2022 è il formato raccomandato per:
- Installazioni offline (immagini VHD/WIM, server senza Internet o con uscita bloccata).
- Rollout coerenti tra server con la stessa build (evita mismatch di versione).
- Automazione tramite PowerShell, MDT/ConfigMgr o pipeline DevOps.
Rispetto all’installazione “on demand” via Windows Update/WSUS, il file .cab è riutilizzabile, cacheabile, e version-locked.
Dove reperire legalmente il pacchetto es‑ES
I canali ufficiali per ottenere l’ISO che contiene tutti i language pack di Windows Server 2022 sono i seguenti.
| Opzione | Dove reperire il pacchetto | Requisiti di licenza | 
|---|---|---|
| Visual Studio Subscriptions (ex MSDN) | Sezione Downloads and Keys | Abbonamento Visual Studio attivo | 
| Volume Licensing Service Center (VLSC) | ISO Windows Server 2022 Language Packs | Contratto Volume Licensing (es. Windows Enterprise E3/E5) | 
Nota pratica: entrambi i portali forniscono l’ISO ufficiale che include tutte le lingue. Una volta montata o estratta l’ISO, troverai il pacchetto spagnolo in \x64\langpacks\es-es\lp.cab.
Vantaggi e limitazioni dell’approccio con .cab
Vantaggi
- Riutilizzo: un solo file per tutte le VM, anche offline.
- Controllo di versione: stessi asset su tutta la farm, allineati alla build del sistema (Windows Server 2022 – 20348.x).
- Velocità: distribuzione rapida via script o strumenti d’immagine (MDT/ConfigMgr).
Svantaggi / Limitazioni
- Licenza: serve accesso a VS Subscriptions o VLSC.
- Spazio: l’ISO dei Language Packs pesa ~2 GB; conviene archiviarla su una share di rete o su DFS.
Prerequisiti operativi
- Permessi: esegui gli script con privilegi amministrativi sulle VM.
- Reboot: l’installazione del language pack richiede un riavvio per completare l’integrazione della UI.
- Accesso al file: rendi disponibile lp.caballe VM tramite:- Montaggio diretto dell’ISO (Mount-DiskImage) e path locale, oppure
- Share SMB di sola lettura (consigliato per rollout massivi), oppure
- PowerShell Direct (-VMName) se le VM sono su Hyper‑V sullo stesso host.
 
- Montaggio diretto dell’ISO (
- WinRM/Firewall (per Invoke‑Command su rete): assicurati che la comunicazione remota sia abilitata (Enable-PSRemoting) e che le regole firewall lo consentano.
- Allineamento di build: usa language pack destinati a Windows Server 2022. Evita pacchetti di versioni diverse (causano errore not applicable).
Installazione locale su una singola VM
- Monta l’ISO dei Language Packs oppure copia lp.cabin locale.
- Esegui come amministratore: Add-WindowsPackage -Online -PackagePath "D:\langpacks\es-es\lp.cab" -NoRestart Set-WinSystemLocale es-ES Set-WinUILanguageOverride es-ES $ll = New-WinUserLanguageList es-ES Set-WinUserLanguageList $ll -Force Restart-Computer
Con questa procedura ottieni l’installazione del language pack e imposti la UI, la locale di sistema e la lingua utente su es‑ES.
Automazione su più VM Hyper‑V (rete)
Per agire in parallelo su più server in dominio o in workgroup (con credenziali appropriate), usa Invoke-Command passando il percorso UNC del .cab ospitato su una share SMB di sola lettura:
$Vms = @("SRV22-APP01","SRV22-DB01","SRV22-WEB01")
$Cab = "\\FileSrv\LangPacks\es-es\lp.cab"
Invoke-Command -ComputerName $Vms -ScriptBlock {
param($Path)
Add-WindowsPackage -Online -PackagePath $Path -NoRestart
Set-WinSystemLocale es-ES
Set-WinUILanguageOverride es-ES
Set-WinUserLanguageList -LanguageList es-ES -Force
} -ArgumentList $Cab
Restart-Computer -ComputerName $Vms -Force Automazione su VM Hyper‑V (PowerShell Direct, senza rete)
Se l’host Hyper‑V e le VM sono Windows 10/11 o Windows Server 2016+ sullo stesso host, puoi usare PowerShell Direct, che non richiede rete né WinRM:
$Vms = "SRV22-APP01","SRV22-DB01","SRV22-WEB01"
$CabLocalOnHost = "C:\ISO\WS2022-LP\x64\langpacks\es-es\lp.cab"
foreach ($vm in $Vms) {
Copy-VMFile -Name $vm -SourcePath $CabLocalOnHost -DestinationPath "C:\Temp\lp.cab" -FileSource Host -CreateFullPath -Force
Invoke-Command -VMName $vm -ScriptBlock {
Add-WindowsPackage -Online -PackagePath "C:\Temp\lp.cab" -NoRestart
Set-WinSystemLocale es-ES
Set-WinUILanguageOverride es-ES
Set-WinUserLanguageList -LanguageList es-ES -Force
Restart-Computer -Force
}
} Tip: con Copy-VMFile sfrutti il canale VMBus e non devi aprire porte di rete. Ideale per lab o cluster di test.
Approccio alternativo: Features on Demand / WSUS
Quando non puoi (o non vuoi) usare il .cab, puoi installare la lingua chiedendola a Windows Update o a WSUS:
Install-Language -Language es-ES -CopyToSettings
oppure, se vuoi includere un metodo di input specifico:
Install-Language -Language es-ES -InputMethod "es-ES" -CopyToSettings
Limite importante: questa via non ti fornisce il file .cab riutilizzabile e richiede connettività a Windows Update o un WSUS configurato per distribuire le lingue.
Verifica dell’installazione
Dopo il riavvio, verifica lingua di sistema e lingua utente:
Get-WinSystemLocale
Get-WinUserLanguageList
Alternativa (inventario pacchetti):
Get-WindowsPackage -Online | Where-Object { $_.PackageName -match "es-ES" }
Oppure DISM:
dism /Online /Get-Intl
Per auditing centralizzato, puoi raccogliere questi output e inviarli a un repository (CSV su share, Log Analytics, ecc.).
Script di distribuzione “robusto” per grandi ambienti
Di seguito un esempio con logging, controlli preliminari e gestione errori. Puoi eseguirlo da una macchina di gestione con permessi amministrativi sulle VM di destinazione.
param(
  [Parameter(Mandatory=$true)] [string[]] $ComputerName,
  [Parameter(Mandatory=$true)] [string]   $CabPath,           # UNC del lp.cab
  [switch] $WhatIf
)
$results = @()
foreach ($cn in $ComputerName) {
try {
Write-Host "[$cn] Verifica raggiungibilità..." -ForegroundColor Cyan
if (-not (Test-Connection -ComputerName $cn -Count 1 -Quiet)) {
throw "Host non raggiungibile"
}
```
$installed = Invoke-Command -ComputerName $cn -ScriptBlock {
  (Get-WinUserLanguageList).LanguageTag -contains 'es-ES'
}
if ($installed) {
  Write-Host "[$cn] es-ES già presente, skip." -ForegroundColor Yellow
  $results += [pscustomobject]@{ Computer=$cn; Status="AlreadyInstalled"; Notes="N/A" }
  continue
}
Write-Host "[$cn] Avvio installazione..." -ForegroundColor Green
if (-not $WhatIf) {
  Invoke-Command -ComputerName $cn -ScriptBlock {
    param($Path)
    Add-WindowsPackage -Online -PackagePath $Path -NoRestart
    Set-WinSystemLocale es-ES
    Set-WinUILanguageOverride es-ES
    Set-WinUserLanguageList -LanguageList es-ES -Force
  } -ArgumentList $CabPath
  Restart-Computer -ComputerName $cn -Force -ErrorAction Stop
}
$results += [pscustomobject]@{ Computer=$cn; Status="Installed"; Notes="Reboot initiated" }
```
}
catch {
$msg = $_.Exception.Message
Write-Host "[$cn] ERRORE: $msg" -ForegroundColor Red
$results += [pscustomobject]@{ Computer=$cn; Status="Error"; Notes=$msg }
}
}
$stamp = Get-Date -Format "yyyyMMdd-HHmmss"
$csv = "C:\Temp\LangPackes-ES$stamp.csv"
$results | Export-Csv -NoTypeInformation -Path $csv
Write-Host "Report salvato in $csv" Servicing offline di immagini (WIM/VHD/VHDX)
Se gestisci golden image o dischi differenziali, puoi integrare il language pack senza avviare il sistema:
Montando una WIM (ad esempio install.wim)
New-Item -ItemType Directory -Path C:\Mount -Force | Out-Null
dism /Mount-Image /ImageFile:C:\Images\install.wim /Index:1 /MountDir:C:\Mount
dism /Image:C:\Mount /Add-Package /PackagePath:C:\LP\es-es\lp.cab
dism /Image:C:\Mount /Set-SysLocale:es-ES /Set-UILang:es-ES /Set-UserLocale:es-ES
dism /Unmount-Image /MountDir:C:\Mount /Commit
Montando un VHD/VHDX (Offline)
Mount-VHD -Path "C:\Images\WS2022-Golden.vhdx" -PassThru | Get-Disk | Get-Partition | Get-Volume
Supponiamo che la partizione Windows sia montata come E:
dism /Image:E:\ /Add-Package /PackagePath:C:\LP\es-es\lp.cab
dism /Image:E:\ /Set-UILang:es-ES /Set-SysLocale:es-ES /Set-UserLocale:es-ES
Dismount-VHD -Path "C:\Images\WS2022-Golden.vhdx"
Questa tecnica è perfetta per immagini master (MDT) o pipeline CI/CD.
Integrazione con MDT/ConfigMgr
Per gestire la distribuzione su larga scala:
- MDT: importa il lp.cabcome Application o Package e aggiungi lo step Run PowerShell Script conAdd-WindowsPackage+ impostazioni di lingua; inserisci lo step prima di State Restore e prevedi il riavvio.
- Configuration Manager: crea un Package con il .cabe un Program che esegue i comandi; come detection method usa l’esistenza della chiaveHKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\es-ES.
Personalizzazioni lingua per nuovi utenti
I cmdlet di cui sopra impostano lingua e locale per l’utente corrente e per il sistema. Se vuoi che tutti i nuovi profili nascano in spagnolo, aggiungi la copia nel profilo predefinito:
$ll = New-WinUserLanguageList es-ES
Set-WinUserLanguageList $ll -Force
Copia le impostazioni nel profilo Default (schermata iniziale e account di sistema)
Set-WinUILanguageOverride es-ES
Set-WinSystemLocale es-ES
Facoltativo: imposta anche il formato regionale
Set-Culture es-ES
Per applicare l’impostazione ai servizi di sistema e alla schermata di logon su immagini “generalizzate”, puoi usare anche un file unattend.xml con i componenti Microsoft-Windows-International-Core. Esempio minimale:
<settings pass="oobeSystem">
  <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
    <InputLocale>es-ES</InputLocale>
    <SystemLocale>es-ES</SystemLocale>
    <UILanguage>es-ES</UILanguage>
    <UserLocale>es-ES</UserLocale>
  </component>
</settings>
Rimozione o rollback
Per disinstallare il language pack:
Uninstall-Language es-ES
Oppure, individuando il nome del pacchetto e rimuovendolo:
Get-WindowsPackage -Online | ? { $_.PackageName -match "es-ES" } | 
  Remove-WindowsPackage -Online -NoRestart
Restart-Computer
Troubleshooting: errori comuni e fix
| Errore/Sintomo | Causa probabile | Rimedi | 
|---|---|---|
| 0x800f081e (not applicable) | Mismatch di versione/edizione del pacchetto | Usa il lp.cabper Windows Server 2022; verificadism /Online /Get-Intle build OS. | 
| 0x800f0831 (sorgente mancante) | Pacchetto non raggiungibile o path errato | Controlla permessi sulla share, path UNC e integrità del file (copia locale per test). | 
| Timeout o riavvii lunghi | DISM/CBS impegnati in manutenzione componenti | Attendi il completamento e consulta C:\Windows\Logs\DISM\dism.logeCBS.log. | 
| UI non in spagnolo dopo l’installazione | Lingua installata ma non impostata come UI | Esegui Set-WinUILanguageOverride es-ESe riavvia. Verifica la lingua per il profilo corrente conGet-WinUserLanguageList. | 
| Impossibile connettersi via Invoke-Command | WinRM non abilitato o firewall | Esegui Enable-PSRemoting -Force, controlla le regole firewall, oppure usa PowerShell Direct (-VMName). | 
Best practice di sicurezza e gestione
- Repository centralizzato: conserva l’ISO e il lp.cabin una share read‑only accessibile alle VM. Valuta DFS‑R per la replica multi‑sito.
- Hash e versioning: calcola l’hash (SHA‑256) del .cabe includilo nel log di distribuzione.
- Least privilege: usa account di servizio con diritti minimi necessari; evita credenziali condivise.
- Finestra di manutenzione: pianifica i riavvii con un maintenance window; notifica gli owner dei servizi.
- Rollback: predefinisci la procedura di disinstallazione o snapshot delle VM prima del cambio.
Esempi rapidi (cheat‑sheet)
- Installazione localeAdd-WindowsPackage -Online -PackagePath "D:\langpacks\es-es\lp.cab"
- Installazione remota (UNC)Invoke-Command -ComputerName $vms -ScriptBlock { Add-WindowsPackage -Online -PackagePath "\\fileserver\langpacks\es-es\lp.cab" }
- Verifica linguaGet-WinSystemLocale; Get-WinUserLanguageList
- Installazione “senza portali” (Windows Update/WSUS)Install-Language es-ES(non genera un .cab riutilizzabile)
- Path del pacchetto\x64\langpacks\es-es\lp.cab
Procedura consigliata passo‑passo
- Scarica l’ISO ufficiale dei Language Packs da Visual Studio Subscriptions o da VLSC in base al tuo contratto di licenza.
- Estrai solo il file lp.cabdella lingua spagnola (es‑ES) e pubblicalo su una share leggibile dalle VM (permessi di sola lettura).
- Distribuisci via PowerShell con lo script: $Vms = @("SRV22-APP01","SRV22-DB01","SRV22-WEB01") $Cab = "\\FileSrv\LangPacks\es-es\lp.cab" Invoke-Command -ComputerName $Vms -ScriptBlock { param($Path) Add-WindowsPackage -Online -PackagePath $Path -NoRestart Set-WinSystemLocale es-ES Set-WinUILanguageOverride es-ES Set-WinUserLanguageList -LanguageList es-ES -Force } -ArgumentList $Cab Restart-Computer -ComputerName $Vms -Force
- Verifica post‑riavvio con Get-WinSystemLocaleeGet-WinUserLanguageList; registra i risultati.
Domande frequenti
Il language pack funziona anche su Server Core?
Sì, la localizzazione di sistema è supportata anche su installazioni Server Core; alcune UI non sono presenti per definizione, ma messaggi di sistema, log e componenti supportati verranno localizzati.
Devo installare componenti aggiuntivi (TTS, OCR, Speech)?
Su Server di solito non servono. Se necessari, valuta i relativi Features on Demand (non inclusi nel lp.cab base).
Posso usare lpksetup.exe?
Nei sistemi moderni è deprecato; resta preferibile Add-WindowsPackage o DISM, e Install-Language per la modalità online.
Il riavvio è obbligatorio?
Per applicare completamente la UI e i componenti di lingua è richiesto un riavvio. Puoi usare -NoRestart durante la fase d’installazione e programmare il reboot al termine.
Come verifico l’allineamento di versione?
Controlla la build del sistema (winver o Get-ComputerInfo) e assicurati che il language pack provenga dall’ISO per Windows Server 2022. Evita pacchetti di release differenti.
Checklist finale
- ISO Language Packs da canale licenziato (VS Subscriptions o VLSC).
- lp.cabes‑ES estratto e pubblicato su share RO.
- Script PowerShell testato su una VM di staging.
- Finestra di manutenzione definita e comunicata.
- Log e report distribuzione archiviati (CSV / SIEM).
- Verifica post‑reboot della lingua di sistema e utente.
Conclusioni
Con il language pack .cab es‑ES e un set di script PowerShell ben progettati puoi rendere coerente e ripetibile la localizzazione di Windows Server 2022 su decine (o centinaia) di VM Hyper‑V. Oltre a rispettare i requisiti di licenza, questa strategia accelera l’operatività, riduce gli errori manuali e si integra facilmente con pipeline di provisioning e strumenti enterprise come MDT/ConfigMgr. Seguendo gli esempi e le best practice qui descritte, porterai in produzione server in spagnolo in modo affidabile, auditabile e reversibile.
Riepilogo rapido
- Fonti ufficiali: Visual Studio Subscriptions & VLSC (ISO Language Packs).
- Percorso del file: \x64\langpacks\es-es\lp.cab.
- Installazione: Add-WindowsPackage+ impostazioni lingua; riavvio.
- Automazione: Invoke-Command(rete) oPowerShell Direct(Hyper‑V).
- Alternativa: Install-Language es-ESvia Windows Update/WSUS (senza.cabriutilizzabile).
- Verifica: Get-WinSystemLocale,Get-WinUserLanguageList,dism /Online /Get-Intl.
Così otterrai VM in spagnolo senza interventi manuali, con una pipeline di distribuzione chiara e governabile.
