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.cab
alle 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.cab
in 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.cab
come 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
.cab
e 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.cab per Windows Server 2022; verifica dism /Online /Get-Intl e 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.log e CBS.log . |
UI non in spagnolo dopo l’installazione | Lingua installata ma non impostata come UI | Esegui Set-WinUILanguageOverride es-ES e riavvia. Verifica la lingua per il profilo corrente con Get-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.cab
in una share read‑only accessibile alle VM. Valuta DFS‑R per la replica multi‑sito. - Hash e versioning: calcola l’hash (SHA‑256) del
.cab
e 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 locale
Add-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 lingua
Get-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.cab
della 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-WinSystemLocale
eGet-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.cab
es‑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-ES
via Windows Update/WSUS (senza.cab
riutilizzabile). - 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.