Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo fornisce informazioni di base sul problema di mantenere le risorse del linguaggio e le funzionalità su richiesta durante gli aggiornamenti del sistema operativo e offre indicazioni che consentono di procedere a breve termine e prepararsi per il lungo termine.
Quando si aggiorna il sistema operativo, è fondamentale mantenere le risorse del linguaggio e le funzionalità su richiesta.When you update the operating system, it's critical to keep language resources and Features on Demand (FOD). Molte organizzazioni commerciali usano Configuration Manager o altri strumenti di gestione per distribuire e orchestrare l'installazione del client Windows usando un'immagine Windows locale o un file WIM (un aggiornamento basato su supporti o su sequenza di attività). Altri utenti esegono aggiornamenti sul posto usando un aggiornamento delle funzionalità del client Windows approvato usando Windows Server Update Services (WSUS), Configuration Manager o strumenti equivalenti (un aggiornamento basato sulla manutenzione).
Nessuno dei due approcci contiene il set completo di funzionalità facoltative di Windows di cui potrebbe essere necessario il dispositivo di un utente, quindi non viene eseguita la migrazione di tali funzionalità al nuovo sistema operativo. In passato, tali funzionalità non erano disponibili in Configuration Manager né WSUS per l'acquisizione locale dopo un aggiornamento delle funzionalità.
Che cos'è il contenuto facoltativo?
Il contenuto facoltativo include gli elementi seguenti:
- Funzionalità generali su richiesta dette anche FOD (ad esempio, Windows Mixed Reality)
- FOD basati sulla lingua e a livello di area (ad esempio, Language.Basic~~~ja-jp~0.0.1.0)
- Experience Pack locali
- Language Pack
Il contenuto facoltativo non è incluso per impostazione predefinita nel file di immagine Windows che fa parte del supporto del sistema operativo disponibile in Volume Licensing Service Center (VLSC). Viene invece rilasciato come file ISO aggiuntivo in VLSC. La spedizione di queste funzionalità dal supporto del sistema operativo e la loro spedizione separatamente riduce il footprint del disco di Windows. Questo approccio offre più spazio per i dati dell'utente. Riduce anche il tempo necessario per gestire il sistema operativo, sia che si installi un aggiornamento qualitativo mensile o che si aggiorni a una versione più recente. Un'immagine Windows predefinita più piccola significa anche meno dati da trasmettere in rete.
Perché l'acquisizione di contenuti facoltativi è complessa?
I problemi relativi al contenuto facoltativo rientrano in genere in due gruppi:
Aggiornamenti del sistema operativo incompleti
La prima sfida è correlata alla migrazione del contenuto durante un aggiornamento delle funzionalità. Quando il programma di installazione di Windows esegue un aggiornamento sul posto, il nuovo sistema operativo viene scritto nel disco dell'utente insieme alla versione precedente in una cartella temporanea, in cui viene installato e preparato un secondo sistema operativo pulito in cui l'utente può spostarsi. Quando si verifica l'operazione, il programma di installazione di Windows enumera il contenuto facoltativo installato già nella versione corrente e prevede di installare la nuova versione di questo contenuto nel nuovo sistema operativo.
Il programma di installazione di Windows deve accedere al contenuto facoltativo. Poiché il contenuto facoltativo non è incluso nell'immagine Windows per impostazione predefinita, il programma di installazione di Windows deve cercare altrove per ottenere i pacchetti di Windows, eseguirne la fase e quindi installarli nel nuovo sistema operativo. Quando non è possibile trovare il contenuto, il risultato è un aggiornamento che manca di funzionalità nel dispositivo, un utente finale frustrato e probabilmente una chiamata al supporto tecnico. Questo punto debole viene talvolta definito errore di migrazione del contenuto facoltativo durante l'aggiornamento. Per gli aggiornamenti basati su supporti, Windows riprova automaticamente dopo l'avvio del nuovo sistema operativo. Chiamiamo questa acquisizione latente.
Errore di acquisizione delle funzionalità avviato dall'utente
La seconda sfida comporta un errore di acquisizione delle funzionalità quando un utente le richiede. Si supponga che un utente che esegue un dispositivo con una nuova versione del client Windows usi un'installazione pulita o un aggiornamento sul posto. L'utente visita Impostazioni e tenta di installare una seconda lingua, altre funzionalità dell'esperienza linguistica o altri contenuti facoltativi. Anche in questo caso, poiché queste funzionalità non sono nel sistema operativo, è necessario acquisire i pacchetti. Per un utente tipico con accesso a Internet, Windows acquisisce le funzionalità da una rete di distribuzione di contenuti Microsoft nelle vicinanze e tutto funziona come progettato. Per gli utenti commerciali, alcuni potrebbero non avere accesso a Internet o avere criteri per impedire l'acquisizione tramite Internet. In queste situazioni, Windows deve acquisire il contenuto da un percorso alternativo. Quando non è possibile trovare il contenuto, gli utenti sono frustrati e potrebbe verificarsi un'altra chiamata al supporto tecnico. Questo punto di dolore viene talvolta definito errore nell'acquisizione di contenuto facoltativo.
Opzioni per l'acquisizione di contenuto facoltativo
La maggior parte delle organizzazioni commerciali comprende i punti critici descritti in precedenza e le discussioni in genere iniziano con loro chiedendo quali piani sono disponibili per affrontare queste sfide. La tabella seguente include più opzioni da considerare, a seconda di come stai attualmente distribuendo il client Windows. Nelle intestazioni di tabella vengono utilizzate le definizioni seguenti:
- Migrazione: supporta la migrazione facoltativa del contenuto durante un aggiornamento.
- Acquisizione: supporta l'acquisizione di contenuto facoltativa ,ovvero avviata dall'utente.
- Supporti: applicabile alle distribuzioni basate su supporti.
- Manutenzione: applicabile alle distribuzioni basate su manutenzione.
Metodo | Migrazione | Acquisition | Elementi multimediali | Manutenzione |
---|---|---|---|---|
Opzione 1: Usare Windows Update | Sì | Sì | No | Sì |
Opzione 2: Usare WSUS con l'integrazione UUP | Sì | Sì | No | Sì |
Opzione 3: Abilitare l'aggiornamento dinamico | Sì | No | Sì | Sì |
Opzione 4: Personalizzare l'immagine Windows prima della distribuzione | Sì | No | Sì | No |
Opzione 5: Installare le funzionalità del linguaggio durante la distribuzione | Parziale | No | Sì | No |
Opzione 6: Installare il contenuto facoltativo dopo la distribuzione | Sì | No | Sì | Sì |
Opzione 7: Configurare l'origine alternativa per le funzionalità su richiesta | No | Parziale | Sì | Sì |
Opzione 1: Usare Windows Update
Windows Update criteri client risolve il problema di contenuto facoltativo. Il contenuto facoltativo viene pubblicato e disponibile per l'acquisizione da parte del programma di installazione di Windows da una rete di distribuzione di contenuti Microsoft nelle vicinanze e acquisito tramite la piattaforma di aggiornamento unificata. Gli scenari facoltativi di migrazione e acquisizione del contenuto funzionano solo quando il dispositivo è connesso a un servizio di aggiornamento che usa la piattaforma di aggiornamento unificata, ad esempio criteri client Windows Update o Windows Update. Se per qualche motivo un Language Pack non viene installato durante l'aggiornamento, l'aggiornamento eseguirà automaticamente il rollback.
Unified Update Platform è un miglioramento della tecnologia windows update sottostante che comporta dimensioni di download inferiori e un protocollo più efficiente per la verifica degli aggiornamenti, l'acquisizione e l'installazione dei pacchetti necessari e l'aggiornamento in un unico passaggio di aggiornamento. La tecnologia è unificata perché riunisce lo stack di aggiornamenti per client Windows, Windows Server e altri prodotti, ad esempio HoloLens.
Valutare la possibilità di passare ai criteri client Windows Update. Non solo lo scenario di contenuto facoltativo funzionerà senza problemi (come avviene oggi per i dispositivi consumer), ma si ottengono anche i vantaggi completi delle dimensioni di download più piccole. Inoltre, i dispositivi sono immuni alla sfida di aggiornare Windows quando la lingua di installazione del sistema operativo viene inavvertitamente modificata in una nuova lingua. In caso contrario, eventuali futuri aggiornamenti delle funzionalità basate su supporti possono non riuscire quando il supporto di installazione ha un linguaggio di installazione diverso. Per altre informazioni su questo problema, vedere Aggiornamento di dispositivi Windows 10 con supporti di installazione diversi dalla lingua di installazione del sistema operativo originale.
Opzione 2: Usare WSUS con l'integrazione UUP
A partire da marzo 2023, UUP è stato integrato con WSUS e Configuration Manager per offrire gli stessi vantaggi facoltativi di acquisizione e contenuto di Windows Update alle soluzioni di gestione locali. Ad esempio:
I FOD e le lingue eseguiranno automaticamente la migrazione per i dispositivi che eseguono un aggiornamento sul posto usando un aggiornamento delle funzionalità client di Windows 11 versione 22H2 approvato da WSUS. Analogamente, gli aggiornamenti come l'aggiornamento cumulativo combinato, gli aggiornamenti dell'installazione e gli aggiornamenti del sistema operativo sicuro sono inclusi e aggiornati in base al mese in cui l'aggiornamento delle funzionalità è stato approvato.
I dispositivi che si aggiornano usando un'immagine Windows locale ma usano WSUS o Configuration Manager per approvare l'aggiornamento cumulativo combinato trarranno vantaggio dal supporto per l'acquisizione di contenuto facoltativo nel sistema operativo Windows aggiornato, oltre alla correzione automatica del sistema operativo.
Il contenuto necessario per abilitarlo verrà acquisito tramite WSUS o Configuration Manager, senza endpoint client che richiedono connettività Internet. Per abilitare questo miglioramento, una volta per ogni versione principale di Windows, è necessario un download significativo nella directory del contenuto WSUS o nel punto di distribuzione. Sono inclusi i pacchetti per supportare l'acquisizione di FOD e lingua, oltre ai pacchetti per abilitare la correzione automatica del sistema operativo a causa del danneggiamento. Per altre informazioni, vedere Pianificare la distribuzione WSUS.
Opzione 3: Abilitare l'aggiornamento dinamico
Se non si è pronti per passare a Windows Update, un'altra opzione consiste nell'abilitare l'aggiornamento dinamico durante un aggiornamento delle funzionalità. Non appena viene avviato un aggiornamento delle funzionalità di Windows, sia tramite un aggiornamento basato su supporti che tramite un aggiornamento delle funzionalità basato su WSUS, l'aggiornamento dinamico è uno dei primi passaggi richiamati. Il programma di installazione di Windows si connette a un URL connesso a Internet ospitato da Microsoft per recuperare il contenuto di Aggiornamento dinamico e quindi applica tali aggiornamenti al supporto di installazione del sistema operativo. Il contenuto acquisito include quanto segue:
- Aggiornamenti dell'installazione: correzioni per Setup.exe file binari o qualsiasi file usato dal programma di installazione per gli aggiornamenti delle funzionalità.
- Aggiornamenti sicuri del sistema operativo: correzioni per il sistema operativo sicuro usato per aggiornare l'ambiente di ripristino windows (WinRE).
- Aggiornamenti dello stack di manutenzione: correzioni necessarie per risolvere il problema dello stack di manutenzione di Windows e quindi necessarie per completare l'aggiornamento delle funzionalità.
- Aggiornamento cumulativo più recente: installa l'aggiornamento cumulativo della qualità più recente.
- Aggiornamenti dei driver: versione più recente dei driver applicabili che sono già stati pubblicati dai produttori in Windows Update e destinati specificamente all'aggiornamento dinamico.
Oltre a questi aggiornamenti per il nuovo sistema operativo, Aggiornamento dinamico acquisisce contenuto facoltativo durante il processo di aggiornamento per assicurarsi che il dispositivo abbia questo contenuto presente al termine dell'aggiornamento. Quindi, anche se il dispositivo non è connesso a Windows Update, recupera il contenuto da una rete di download di contenuti Microsoft (CDN) nelle vicinanze. Questo approccio risolve il primo punto di difficoltà con contenuto facoltativo, ma non con l'acquisizione avviata dall'utente. Per impostazione predefinita, l'aggiornamento dinamico è abilitato dal programma di installazione di Windows. È possibile abilitare o disabilitare l'aggiornamento dinamico usando l'opzione /DynamicUpdate nel programma di installazione di Windows. Se si usa l'approccio basato sulla manutenzione, è possibile impostare questo valore con setupconfig.ini
. Per informazioni dettagliate, vedere Panoramica dell'automazione dell'installazione di Windows .
L'aggiornamento dinamico può essere configurato con opzioni aggiuntive. Ad esempio, è possibile che si vogliano sfruttare i vantaggi della migrazione facoltativa del contenuto senza acquisire automaticamente l'aggiornamento qualitativo più recente. È possibile eseguire questa operazione con l'opzione /DynamicUpdate NoLCU di Installazione di Windows. Successivamente, si seguirà separatamente il processo esistente per il test e l'approvazione degli aggiornamenti mensili. Lo svantaggio di questo approccio è il riavvio del dispositivo per l'aggiornamento cumulativo più recente, poiché non era disponibile durante l'aggiornamento delle funzionalità.
Un'ulteriore considerazione quando si usa l'aggiornamento dinamico è l'effetto sulla rete. Uno dei principali ostacoli per questo approccio è la preoccupazione che ogni dispositivo recupererà separatamente questo contenuto da Microsoft. Il programma di installazione scarica il contenuto dell'aggiornamento dinamico usando Ottimizzazione recapito, quando disponibile. Per i dispositivi non connessi a Internet, è disponibile un subset del contenuto dell'aggiornamento dinamico tramite WSUS e il catalogo Microsoft.
Opzione 4: Personalizzare l'immagine Windows prima della distribuzione
Per molte organizzazioni, il flusso di lavoro di distribuzione prevede una sequenza di attività Configuration Manager che esegue un aggiornamento basato su supporti. Alcuni clienti non hanno connettività Internet o la connettività è scarsa e quindi non possono abilitare l'aggiornamento dinamico. In questi casi, è consigliabile installare il contenuto facoltativo prima della distribuzione. Questa attività viene talvolta definita personalizzazione del supporto di installazione.
È possibile personalizzare l'immagine Windows in questi modi:
- Applicazione di un aggiornamento cumulativo
- Applicazione degli aggiornamenti allo stack di manutenzione
- Applicazione di aggiornamenti a
Setup.exe
file binari o ad altri file usati dal programma di installazione per gli aggiornamenti delle funzionalità - Applicazione di aggiornamenti per il sistema operativo sicuro (SafeOS) usato per l'ambiente di ripristino di Windows
- Aggiunta o rimozione di lingue
- Aggiunta o rimozione di funzionalità su richiesta
Il vantaggio di questa opzione è che l'immagine Windows può includere lingue aggiuntive, funzionalità di esperienza del linguaggio e altre funzionalità su richiesta tramite aggiornamenti occasionali dell'immagine. È quindi possibile usarli in una sequenza di attività esistente o in una distribuzione personalizzata in cui Setup.exe
è coinvolto. Lo svantaggio di questo approccio consiste nel fatto che richiede una certa preparazione dell'immagine in anticipo, incluso lo scripting con Gestione e manutenzione immagini distribuzione per installare i pacchetti aggiuntivi. Significa anche che l'immagine è la stessa per tutti i dispositivi che la utilizzano e potrebbe contenere più funzionalità di quelle necessarie per alcuni utenti. Per altre informazioni sulla personalizzazione dei supporti, vedere Aggiornamento di supporti Windows 10 con pacchetti di aggiornamento dinamico. Analogamente all'aggiornamento dinamico, è ancora disponibile una soluzione per la migrazione del contenuto facoltativo, ma non per l'acquisizione di contenuto facoltativo avviata dall'utente. Esiste anche una variante di questa opzione in cui il supporto viene aggiornato nel dispositivo poco prima dell'installazione. Questa opzione consente la personalizzazione dell'immagine specifica del dispositivo in base a ciò che è attualmente installato.
Opzione 5: Installare le funzionalità del linguaggio durante la distribuzione
Una soluzione parziale per risolvere il primo punto debole della mancata migrazione del contenuto facoltativo durante l'aggiornamento consiste nell'inserire un subset di contenuto facoltativo durante il processo di aggiornamento. Questo approccio usa l'opzione di installazione di Windows /InstallLangPacks per aggiungere Language Pack e funzionalità di linguaggio, ad esempio il riconoscimento vocale da una cartella che contiene i pacchetti. Questo approccio consente a un professionista IT di assumere un subset di contenuti facoltativi e di metterli in scena all'interno della propria rete. Se si usa l'approccio basato sulla manutenzione, è possibile configurare InstallLangPacks usando setupconfig.ini
. Per altre informazioni, vedere Panoramica di Automazione installazione di Windows.
Durante l'esecuzione del programma di installazione, questi pacchetti vengono inseriti nel nuovo sistema operativo durante l'installazione. Può essere un'alternativa all'abilitazione dell'aggiornamento dinamico o alla personalizzazione dell'immagine del sistema operativo prima della distribuzione. È necessario prestare attenzione a questo approccio, perché i pacchetti non possono essere rinominati. Inoltre, il contenuto proviene da due ISO di supporto di versione separati. La chiave consiste nel copiare sia i pacchetti FOD che i metadati FOD .cab dall'ISO FOD nella cartella e il Language Pack specifico dell'architettura .cab file dall'ISO LPLIP. Gli errori di InstallLangPacks vengono considerati irreversibili e viene eseguito il rollback dell'intero aggiornamento. L'idea è quella di non lasciare l'utente in uno stato non valido perché gli aggiornamenti basati su supporti non esezionano fod e lingue (a meno che l'aggiornamento dinamico non sia abilitato).
Questo approccio presenta alcuni vantaggi interessanti. Non è necessario modificare l'immagine Windows originale, risparmiando tempo e script.
Opzione 6: Installare il contenuto facoltativo dopo la distribuzione
Questa opzione è simile all'opzione 4 in quanto si personalizza l'immagine del sistema operativo con più contenuto facoltativo dopo la distribuzione. I professionisti IT possono estendere il comportamento del programma di installazione di Windows eseguendo i propri script di azione personalizzati durante e dopo un aggiornamento delle funzionalità. Per informazioni dettagliate, vedere Eseguire azioni personalizzate durante l'aggiornamento delle funzionalità . Con questo approccio, è possibile creare una migrazione specifica del dispositivo del contenuto facoltativo acquisendo il contenuto facoltativo installato nel sistema operativo e quindi salvando l'elenco per installare lo stesso contenuto facoltativo nel nuovo sistema operativo. Analogamente all'opzione 5, si ospiterebbe internamente una condivisione di rete che contiene l'origine dei pacchetti di contenuto facoltativi. Quindi, durante l'esecuzione del programma di installazione nel dispositivo, acquisire l'elenco del contenuto facoltativo installato dal sistema operativo di origine e salvare. Successivamente, al termine dell'installazione, usare l'elenco per installare il contenuto facoltativo, lasciando il dispositivo dell'utente senza perdita di funzionalità.
Opzione 7: Configurare un'origine alternativa per il contenuto facoltativo
Diverse opzioni consentono di risolvere i problemi di migrazione del contenuto facoltativi durante un aggiornamento sul posto. Per risolvere il secondo punto debole dell'acquisizione semplice di contenuto facoltativo nel caso avviato dall'utente, è possibile configurare ogni dispositivo usando il Criteri di gruppo Specificare le impostazioni per l'installazione del componente facoltativo e il ripristino dei componenti. Questa impostazione di criterio specifica i percorsi di rete che verranno usati per correggere il danneggiamento del sistema operativo e per abilitare le funzionalità facoltative per cui sono stati rimossi i file di payload. Questo approccio presenta lo svantaggio di un maggior numero di contenuti da ospitare all'interno della rete (oltre all'immagine del sistema operativo che potrebbe essere ancora in fase di distribuzione in alcuni client), ma ha il vantaggio di acquisire contenuto all'interno della rete. Alcuni promemoria relativi a questo criterio:
- Il percorso del file dell'origine alternativa deve essere un percorso completo; più posizioni possono essere separate da un punto e virgola.
- Questa impostazione non supporta l'installazione di Language Pack da un percorso di file di origine alternativo, ma solo da funzionalità su richiesta. Se il criterio è configurato per acquisire contenuto da Windows Update, verranno acquisiti i Language Pack.
- Se questa impostazione non è configurata o disabilitata, i file vengono scaricati dal percorso Windows Update predefinito, ad esempio Windows Update criteri client o WSUS.
Per altre informazioni, vedere Configurare un'origine ripristino Windows e Come rendere disponibili funzionalità su richiesta e Language Pack quando si usa WSUS o Configuration Manager.
Altre risorse
Per altre informazioni sulla piattaforma di aggiornamento unificata e sugli approcci descritti in questo articolo, vedere le risorse seguenti:
- Pianificare la distribuzione di WSUS
- /InstallLangPacks
- /DynamicUpdate
- Configurare un'origine di ripristino di Windows
- Eseguire azioni personalizzate durante l'aggiornamento delle funzionalità
- Piattaforma di aggiornamento unificata
- Aggiornamento dei supporti di installazione di Windows con pacchetti di aggiornamento dinamico
- Panoramica di automazione dell'installazione di Windows
Script di esempio
Le opzioni 4 e 6 prevedono il maggior numero di script. Gli script di esempio per l'opzione 4 esistono già, quindi esaminiamo gli script di esempio per l'opzione 6: Installare il contenuto facoltativo dopo la distribuzione.
Creazione di un repository di contenuto facoltativo
Per iniziare, viene compilato un repository di contenuti e host facoltativi in una condivisione di rete. Questo contenuto è un subset di contenuto dei FOD e degli ISO del Language Pack forniti con ogni versione. Questo repository o repository viene configurato solo con i FOD necessari all'organizzazione, usando Gestione e manutenzione immagini distribuzione /Export. Ad esempio, un superset basato sull'inventario delle funzionalità facoltative installate nei dispositivi esistenti. In questo caso, escludiamo la funzionalità Windows Mixed Reality. Inoltre, tutti i Language Pack vengono copiati nella radice del repository.
# Declare media for FOD and LPs
$LP_ISO_PATH = "C:\_IMAGE\2004_ISO\CLIENTLANGPACKDVD_OEM_MULTI.iso"
$FOD_ISO_PATH = "C:\_IMAGE\2004_ISO\FOD-PACKAGES_OEM_PT1_amd64fre_MULTI.iso"
# Declare folders
$WORKING_PATH = "C:\_IMAGE\BuildRepo"
$MEDIA_PATH = "C:\_IMAGE\2004_SETUP"
$MAIN_OS_MOUNT = $WORKING_PATH + "\MainOSMount"
$REPO_PATH = $WORKING_PATH + "\Repo"
# Create folders for mounting image optional content repository
if (Test-Path $MAIN_OS_MOUNT) {
Remove-Item -Path $MAIN_OS_MOUNT -Force -Recurse -ErrorAction stop| Out-Null
}
if (Test-Path $REPO_PATH) {
Remove-Item -Path $REPO_PATH -Force -Recurse -ErrorAction stop| Out-Null
}
New-Item -ItemType Directory -Force -Path $MAIN_OS_MOUNT -ErrorAction stop| Out-Null
New-Item -ItemType Directory -Force -Path $REPO_PATH -ErrorAction stop| Out-Null
# Mount the main OS, I'll use this throughout the script
Write-Host "Mounting main OS"
Mount-WindowsImage -ImagePath $MEDIA_PATH"\sources\install.wim" -Index 1 -Path $MAIN_OS_MOUNT -ErrorAction stop| Out-Null
# Mount the LP ISO
Write-Host "Mounting LP ISO"
$LP_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter
# Declare language related cabs
$OS_LP_PATH = $LP_ISO_DRIVE_LETTER + ":\x64\langpacks\" + "*.cab"
# Mount the FOD ISO
Write-Host "Mounting FOD ISO"
$FOD_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter
$FOD_PATH = $FOD_ISO_DRIVE_LETTER + ":\"
# Export the FODs from the ISO that we are interested in
Write-Host "Exporting FODs to Repo"
DISM /image:$MAIN_OS_MOUNT /export-source /source:$FOD_PATH /target:$REPO_PATH `
/capabilityname:Accessibility.Braille~~~~0.0.1.0 `
/capabilityname:App.StepsRecorder~~~~0.0.1.0 `
/capabilityname:App.WirelessDisplay.Connect~~~~0.0.1.0 `
/capabilityname:Browser.InternetExplorer~~~~0.0.11.0 `
/capabilityname:DirectX.Configuration.Database~~~~0.0.1.0 `
/capabilityname:Language.Basic~~~af-za~0.0.1.0 `
/capabilityname:Language.Basic~~~ar-sa~0.0.1.0 `
/capabilityname:Language.Basic~~~as-in~0.0.1.0 `
/capabilityname:Language.Basic~~~az-latn-az~0.0.1.0 `
/capabilityname:Language.Basic~~~ba-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~be-by~0.0.1.0 `
/capabilityname:Language.Basic~~~bg-bg~0.0.1.0 `
/capabilityname:Language.Basic~~~bn-bd~0.0.1.0 `
/capabilityname:Language.Basic~~~bn-in~0.0.1.0 `
/capabilityname:Language.Basic~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.Basic~~~ca-es~0.0.1.0 `
/capabilityname:Language.Basic~~~cs-cz~0.0.1.0 `
/capabilityname:Language.Basic~~~cy-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~da-dk~0.0.1.0 `
/capabilityname:Language.Basic~~~de-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~de-de~0.0.1.0 `
/capabilityname:Language.Basic~~~el-gr~0.0.1.0 `
/capabilityname:Language.Basic~~~en-au~0.0.1.0 `
/capabilityname:Language.Basic~~~en-ca~0.0.1.0 `
/capabilityname:Language.Basic~~~en-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~en-in~0.0.1.0 `
/capabilityname:Language.Basic~~~en-us~0.0.1.0 `
/capabilityname:Language.Basic~~~es-es~0.0.1.0 `
/capabilityname:Language.Basic~~~es-mx~0.0.1.0 `
/capabilityname:Language.Basic~~~es-us~0.0.1.0 `
/capabilityname:Language.Basic~~~et-ee~0.0.1.0 `
/capabilityname:Language.Basic~~~eu-es~0.0.1.0 `
/capabilityname:Language.Basic~~~fa-ir~0.0.1.0 `
/capabilityname:Language.Basic~~~fi-fi~0.0.1.0 `
/capabilityname:Language.Basic~~~fil-ph~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-be~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-ca~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Basic~~~ga-ie~0.0.1.0 `
/capabilityname:Language.Basic~~~gd-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~gl-es~0.0.1.0 `
/capabilityname:Language.Basic~~~gu-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ha-latn-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~haw-us~0.0.1.0 `
/capabilityname:Language.Basic~~~he-il~0.0.1.0 `
/capabilityname:Language.Basic~~~hi-in~0.0.1.0 `
/capabilityname:Language.Basic~~~hr-hr~0.0.1.0 `
/capabilityname:Language.Basic~~~hu-hu~0.0.1.0 `
/capabilityname:Language.Basic~~~hy-am~0.0.1.0 `
/capabilityname:Language.Basic~~~id-id~0.0.1.0 `
/capabilityname:Language.Basic~~~ig-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~is-is~0.0.1.0 `
/capabilityname:Language.Basic~~~it-it~0.0.1.0 `
/capabilityname:Language.Basic~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Basic~~~ka-ge~0.0.1.0 `
/capabilityname:Language.Basic~~~kk-kz~0.0.1.0 `
/capabilityname:Language.Basic~~~kl-gl~0.0.1.0 `
/capabilityname:Language.Basic~~~kn-in~0.0.1.0 `
/capabilityname:Language.Basic~~~kok-deva-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ko-kr~0.0.1.0 `
/capabilityname:Language.Basic~~~ky-kg~0.0.1.0 `
/capabilityname:Language.Basic~~~lb-lu~0.0.1.0 `
/capabilityname:Language.Basic~~~lt-lt~0.0.1.0 `
/capabilityname:Language.Basic~~~lv-lv~0.0.1.0 `
/capabilityname:Language.Basic~~~mi-nz~0.0.1.0 `
/capabilityname:Language.Basic~~~mk-mk~0.0.1.0 `
/capabilityname:Language.Basic~~~ml-in~0.0.1.0 `
/capabilityname:Language.Basic~~~mn-mn~0.0.1.0 `
/capabilityname:Language.Basic~~~mr-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ms-bn~0.0.1.0 `
/capabilityname:Language.Basic~~~ms-my~0.0.1.0 `
/capabilityname:Language.Basic~~~mt-mt~0.0.1.0 `
/capabilityname:Language.Basic~~~nb-no~0.0.1.0 `
/capabilityname:Language.Basic~~~ne-np~0.0.1.0 `
/capabilityname:Language.Basic~~~nl-nl~0.0.1.0 `
/capabilityname:Language.Basic~~~nn-no~0.0.1.0 `
/capabilityname:Language.Basic~~~nso-za~0.0.1.0 `
/capabilityname:Language.Basic~~~or-in~0.0.1.0 `
/capabilityname:Language.Basic~~~pa-in~0.0.1.0 `
/capabilityname:Language.Basic~~~pl-pl~0.0.1.0 `
/capabilityname:Language.Basic~~~ps-af~0.0.1.0 `
/capabilityname:Language.Basic~~~pt-br~0.0.1.0 `
/capabilityname:Language.Basic~~~pt-pt~0.0.1.0 `
/capabilityname:Language.Basic~~~rm-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~ro-ro~0.0.1.0 `
/capabilityname:Language.Basic~~~ru-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~rw-rw~0.0.1.0 `
/capabilityname:Language.Basic~~~sah-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~si-lk~0.0.1.0 `
/capabilityname:Language.Basic~~~sk-sk~0.0.1.0 `
/capabilityname:Language.Basic~~~sl-si~0.0.1.0 `
/capabilityname:Language.Basic~~~sq-al~0.0.1.0 `
/capabilityname:Language.Basic~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.Basic~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.Basic~~~sv-se~0.0.1.0 `
/capabilityname:Language.Basic~~~sw-ke~0.0.1.0 `
/capabilityname:Language.Basic~~~ta-in~0.0.1.0 `
/capabilityname:Language.Basic~~~te-in~0.0.1.0 `
/capabilityname:Language.Basic~~~tg-cyrl-tj~0.0.1.0 `
/capabilityname:Language.Basic~~~th-th~0.0.1.0 `
/capabilityname:Language.Basic~~~tk-tm~0.0.1.0 `
/capabilityname:Language.Basic~~~tn-za~0.0.1.0 `
/capabilityname:Language.Basic~~~tr-tr~0.0.1.0 `
/capabilityname:Language.Basic~~~tt-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~ug-cn~0.0.1.0 `
/capabilityname:Language.Basic~~~uk-ua~0.0.1.0 `
/capabilityname:Language.Basic~~~ur-pk~0.0.1.0 `
/capabilityname:Language.Basic~~~uz-latn-uz~0.0.1.0 `
/capabilityname:Language.Basic~~~vi-vn~0.0.1.0 `
/capabilityname:Language.Basic~~~wo-sn~0.0.1.0 `
/capabilityname:Language.Basic~~~xh-za~0.0.1.0 `
/capabilityname:Language.Basic~~~yo-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Basic~~~zu-za~0.0.1.0 `
/capabilityname:Language.Fonts.Arab~~~und-Arab~0.0.1.0 `
/capabilityname:Language.Fonts.Beng~~~und-Beng~0.0.1.0 `
/capabilityname:Language.Fonts.Cans~~~und-Cans~0.0.1.0 `
/capabilityname:Language.Fonts.Cher~~~und-Cher~0.0.1.0 `
/capabilityname:Language.Fonts.Deva~~~und-Deva~0.0.1.0 `
/capabilityname:Language.Fonts.Ethi~~~und-Ethi~0.0.1.0 `
/capabilityname:Language.Fonts.Gujr~~~und-Gujr~0.0.1.0 `
/capabilityname:Language.Fonts.Guru~~~und-Guru~0.0.1.0 `
/capabilityname:Language.Fonts.Hans~~~und-Hans~0.0.1.0 `
/capabilityname:Language.Fonts.Hant~~~und-Hant~0.0.1.0 `
/capabilityname:Language.Fonts.Hebr~~~und-Hebr~0.0.1.0 `
/capabilityname:Language.Fonts.Jpan~~~und-Jpan~0.0.1.0 `
/capabilityname:Language.Fonts.Khmr~~~und-Khmr~0.0.1.0 `
/capabilityname:Language.Fonts.Knda~~~und-Knda~0.0.1.0 `
/capabilityname:Language.Fonts.Kore~~~und-Kore~0.0.1.0 `
/capabilityname:Language.Fonts.Laoo~~~und-Laoo~0.0.1.0 `
/capabilityname:Language.Fonts.Mlym~~~und-Mlym~0.0.1.0 `
/capabilityname:Language.Fonts.Orya~~~und-Orya~0.0.1.0 `
/capabilityname:Language.Fonts.PanEuropeanSupplementalFonts~~~0.0.1.0 `
/capabilityname:Language.Fonts.Sinh~~~und-Sinh~0.0.1.0 `
/capabilityname:Language.Fonts.Syrc~~~und-Syrc~0.0.1.0 `
/capabilityname:Language.Fonts.Taml~~~und-Taml~0.0.1.0 `
/capabilityname:Language.Fonts.Telu~~~und-Telu~0.0.1.0 `
/capabilityname:Language.Fonts.Thai~~~und-Thai~0.0.1.0 `
/capabilityname:Language.Handwriting~~~af-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ca-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~cs-cz~0.0.1.0 `
/capabilityname:Language.Handwriting~~~cy-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~da-dk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~de-de~0.0.1.0 `
/capabilityname:Language.Handwriting~~~el-gr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~en-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~en-us~0.0.1.0 `
/capabilityname:Language.Handwriting~~~es-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~es-mx~0.0.1.0 `
/capabilityname:Language.Handwriting~~~eu-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~fi-fi~0.0.1.0 `
/capabilityname:Language.Handwriting~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ga-ie~0.0.1.0 `
/capabilityname:Language.Handwriting~~~gd-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~gl-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~hi-in~0.0.1.0 `
/capabilityname:Language.Handwriting~~~hr-hr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~id-id~0.0.1.0 `
/capabilityname:Language.Handwriting~~~it-it~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ko-kr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~lb-lu~0.0.1.0 `
/capabilityname:Language.Handwriting~~~mi-nz~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ms-bn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ms-my~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nb-no~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nl-nl~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nn-no~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nso-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pl-pl~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pt-br~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pt-pt~0.0.1.0 `
/capabilityname:Language.Handwriting~~~rm-ch~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ro-ro~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ru-ru~0.0.1.0 `
/capabilityname:Language.Handwriting~~~rw-rw~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sk-sk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sl-si~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sq-al~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sv-se~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sw-ke~0.0.1.0 `
/capabilityname:Language.Handwriting~~~tn-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~tr-tr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~wo-sn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~xh-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zu-za~0.0.1.0 `
/capabilityname:Language.LocaleData~~~zh-tw~0.0.1.0 `
/capabilityname:Language.OCR~~~ar-sa~0.0.1.0 `
/capabilityname:Language.OCR~~~bg-bg~0.0.1.0 `
/capabilityname:Language.OCR~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.OCR~~~cs-cz~0.0.1.0 `
/capabilityname:Language.OCR~~~da-dk~0.0.1.0 `
/capabilityname:Language.OCR~~~de-de~0.0.1.0 `
/capabilityname:Language.OCR~~~el-gr~0.0.1.0 `
/capabilityname:Language.OCR~~~en-gb~0.0.1.0 `
/capabilityname:Language.OCR~~~en-us~0.0.1.0 `
/capabilityname:Language.OCR~~~es-es~0.0.1.0 `
/capabilityname:Language.OCR~~~es-mx~0.0.1.0 `
/capabilityname:Language.OCR~~~fi-fi~0.0.1.0 `
/capabilityname:Language.OCR~~~fr-ca~0.0.1.0 `
/capabilityname:Language.OCR~~~fr-fr~0.0.1.0 `
/capabilityname:Language.OCR~~~hr-hr~0.0.1.0 `
/capabilityname:Language.OCR~~~hu-hu~0.0.1.0 `
/capabilityname:Language.OCR~~~it-it~0.0.1.0 `
/capabilityname:Language.OCR~~~ja-jp~0.0.1.0 `
/capabilityname:Language.OCR~~~ko-kr~0.0.1.0 `
/capabilityname:Language.OCR~~~nb-no~0.0.1.0 `
/capabilityname:Language.OCR~~~nl-nl~0.0.1.0 `
/capabilityname:Language.OCR~~~pl-pl~0.0.1.0 `
/capabilityname:Language.OCR~~~pt-br~0.0.1.0 `
/capabilityname:Language.OCR~~~pt-pt~0.0.1.0 `
/capabilityname:Language.OCR~~~ro-ro~0.0.1.0 `
/capabilityname:Language.OCR~~~ru-ru~0.0.1.0 `
/capabilityname:Language.OCR~~~sk-sk~0.0.1.0 `
/capabilityname:Language.OCR~~~sl-si~0.0.1.0 `
/capabilityname:Language.OCR~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.OCR~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.OCR~~~sv-se~0.0.1.0 `
/capabilityname:Language.OCR~~~tr-tr~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-cn~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-hk~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Speech~~~da-dk~0.0.1.0 `
/capabilityname:Language.Speech~~~de-de~0.0.1.0 `
/capabilityname:Language.Speech~~~en-au~0.0.1.0 `
/capabilityname:Language.Speech~~~en-ca~0.0.1.0 `
/capabilityname:Language.Speech~~~en-gb~0.0.1.0 `
/capabilityname:Language.Speech~~~en-in~0.0.1.0 `
/capabilityname:Language.Speech~~~en-us~0.0.1.0 `
/capabilityname:Language.Speech~~~es-es~0.0.1.0 `
/capabilityname:Language.Speech~~~es-mx~0.0.1.0 `
/capabilityname:Language.Speech~~~fr-ca~0.0.1.0 `
/capabilityname:Language.Speech~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Speech~~~it-it~0.0.1.0 `
/capabilityname:Language.Speech~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Speech~~~pt-br~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-tw~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ar-eg~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ar-sa~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~bg-bg~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ca-es~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~cs-cz~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~da-dk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-at~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-ch~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-de~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~el-gr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-au~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-ca~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-gb~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-ie~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-us~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~es-es~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~es-mx~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fi-fi~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-ca~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-ch~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-fr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~he-il~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hi-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hr-hr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hu-hu~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~id-id~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~it-it~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ja-jp~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ko-kr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ms-my~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nb-no~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nl-be~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nl-nl~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pl-pl~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pt-br~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pt-pt~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ro-ro~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ru-ru~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sk-sk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sl-si~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sv-se~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ta-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~th-th~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~tr-tr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~vi-vn~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-cn~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-hk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-tw~0.0.1.0 `
/capabilityname:MathRecognizer~~~~0.0.1.0 `
/capabilityname:Microsoft.Onecore.StorageManagement~~~~0.0.1.0 `
/capabilityname:Microsoft.WebDriver~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.MSPaint~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.Notepad~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.PowerShell.ISE~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.StorageManagement~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.WordPad~~~~0.0.1.0 `
/capabilityname:Msix.PackagingTool.Driver~~~~0.0.1.0 `
/capabilityname:NetFX3~~ `
/capabilityname:Network.Irda~~~~0.0.1.0 `
/capabilityname:OneCoreUAP.OneSync~~~~0.0.1.0 `
/capabilityname:OpenSSH.Client~~~~0.0.1.0 `
/capabilityname:OpenSSH.Server~~~~0.0.1.0 `
/capabilityname:Print.EnterpriseCloudPrint~~~~0.0.1.0 `
/capabilityname:Print.Fax.Scan~~~~0.0.1.0 `
/capabilityname:Print.Management.Console~~~~0.0.1.0 `
/capabilityname:Print.MopriaCloudService~~~~0.0.1.0 `
/capabilityname:RasCMAK.Client~~~~0.0.1.0 `
/capabilityname:RIP.Listener~~~~0.0.1.0 `
/capabilityname:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.BitLocker.Recovery.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.CertificateServices.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.DHCP.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.Dns.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.FailoverCluster.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.FileServices.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.IPAM.Client.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.LLDP.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.NetworkController.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.NetworkLoadBalancing.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.RemoteAccess.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.ServerManager.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.Shielded.VM.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.StorageMigrationService.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.StorageReplica.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.SystemInsights.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.VolumeActivation.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.WSUS.Tools~~~~0.0.1.0 `
/capabilityname:ServerCore.AppCompatibility~~~~0.0.1.0 `
/capabilityname:SNMP.Client~~~~0.0.1.0 `
/capabilityname:Tools.DeveloperMode.Core~~~~0.0.1.0 `
/capabilityname:Tools.Graphics.DirectX~~~~0.0.1.0 `
/capabilityname:Windows.Client.ShellComponents~~~~0.0.1.0 `
/capabilityname:Windows.Desktop.EMS-SAC.Tools~~~~0.0.1.0 `
/capabilityname:WMI-SNMP-Provider.Client~~~~0.0.1.0 `
/capabilityname:XPS.Viewer~~~~0.0.1.0
# This one is large, lets skip for now
#/capabilityname:Analog.Holographic.Desktop~~~~0.0.1.0 `
# Copy language caps to the repo
Copy-Item -Path $OS_LP_PATH -Destination $REPO_PATH -Force -ErrorAction stop | Out-Null
# Dismount OS image
Dismount-WindowsImage -Path $MAIN_OS_MOUNT -Discard -ErrorAction ignore | Out-Null
# Dismount ISO images
Write-Host "Dismounting ISO images"
Dismount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction ignore | Out-Null
Dismount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction ignore | Out-Null
Salvataggio del contenuto facoltativo nel sistema operativo di origine
Per salvare lo stato del contenuto facoltativo nel sistema operativo di origine, viene creato uno script di azione personalizzato da eseguire prima dell'installazione del sistema operativo. In questo script vengono salvate le funzionalità facoltative e le risorse della lingua in un file. Viene anche creata una copia locale del repository con solo i file necessari in base alle lingue installate nel sistema operativo di origine. Questa azione limita la copia dei file.
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$LANG_PATH = $OUTPUT_PATH + "sourceLang.txt"
$CAP_PATH = $OUTPUT_PATH + "sourceCapability.txt"
$OSVERSION_PATH = $OUTPUT_PATH + "sourceVersion.txt"
$REPO_PATH = "Z:\Repo\"
$LOCAL_REPO_PATH = $OUTPUT_PATH + "Local_Repo\"
Function Get-TS { return "{0:HH:mm:ss}" -f (Get-Date) }
Function Log
{
param (
[Parameter(Mandatory=$True)]
[string]$MESSAGE
)
$M = "$(Get-TS): PreInstall: $MESSAGE"
Write-Host $M
Add-Content -Path $LOG_PATH -Value $M
}
Function IsLangFile
{
param (
[Parameter(Mandatory=$True)]
[string]$PATH
)
if (($PATH -match '[-_~]ar[-_~]') -or ($PATH -match '[-_~]bg[-_~]') -or ($PATH -match '[-_~]cs[-_~]') -or `
($PATH -match '[-_~]da[-_~]') -or ($PATH -match '[-_~]de[-_~]') -or ($PATH -match '[-_~]el[-_~]') -or `
($PATH -match '[-_~]en[-_~]') -or ($PATH -match '[-_~]es[-_~]') -or ($PATH -match '[-_~]et[-_~]') -or `
($PATH -match '[-_~]fi[-_~]') -or ($PATH -match '[-_~]fr[-_~]') -or ($PATH -match '[-_~]he[-_~]') -or `
($PATH -match '[-_~]hr[-_~]') -or ($PATH -match '[-_~]hu[-_~]') -or ($PATH -match '[-_~]it[-_~]') -or `
($PATH -match '[-_~]ja[-_~]') -or ($PATH -match '[-_~]ko[-_~]') -or ($PATH -match '[-_~]lt[-_~]') -or `
($PATH -match '[-_~]lv[-_~]') -or ($PATH -match '[-_~]nb[-_~]') -or ($PATH -match '[-_~]nl[-_~]') -or `
($PATH -match '[-_~]pl[-_~]') -or ($PATH -match '[-_~]pt[-_~]') -or ($PATH -match '[-_~]ro[-_~]') -or `
($PATH -match '[-_~]ru[-_~]') -or ($PATH -match '[-_~]sk[-_~]') -or ($PATH -match '[-_~]sl[-_~]') -or `
($PATH -match '[-_~]sv[-_~]') -or ($PATH -match '[-_~]th[-_~]') -or ($PATH -match '[-_~]tr[-_~]') -or `
($PATH -match '[-_~]uk[-_~]') -or ($PATH -match '[-_~]zh[-_~]') -or ($PATH -match '[-_~]sr[-_~]')) {
return $True
}
else {
return $False
}
}
# Remove the log
Remove-Item -Path $LOG_PATH -Force -ErrorAction ignore | Out-Null
Log "Starting"
# Remove state files, keep repo if it exists
Remove-Item -Path $LANG_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $CAP_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $OSVERSION_PATH -Force -ErrorAction ignore | Out-Null
# Get OS version, to use later for detecting compat scans versus OS installation
$OSINFO = Get-CimInstance Win32_OperatingSystem
Log "OS Version: $($OSINFO.Version)"
Add-Content -Path $OSVERSION_PATH -Value $OSINFO.Version
# Get installed languages from international settings
$INTL = DISM.exe /Online /Get-Intl /English
# Save only output lines with installed languages
$LANGUAGES = $INTL | Select-String -SimpleMatch 'Installed language(s)'
# Replace with null so we have a simple list of language codes
$LANGUAGES = $LANGUAGES | ForEach-Object {$_.Line.Replace("Installed language(s): ","")}
# Save System Language, save only output line with default system language
$SYSLANG = $INTL | Select-String -SimpleMatch 'Default system UI language'
# Replace with null so we have the language code
$SYSLANG = $SYSLANG | ForEach-Object {$_.Line.Replace("Default system UI language : ","")}
# Save these languages
Log "Default system UI language on source OS: $($SYSLANG)"
ForEach ($ITEM in $LANGUAGES) {
Log "Installed language on source OS: $($ITEM)"
Add-Content -Path $LANG_PATH -Value $ITEM
}
# Get and save installed packages, we'll use this for debugging
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
if($ITEM.PackageState -eq "Installed") {
Log "Package $($ITEM.PackageName) is installed"
}
}
# Get and save capabilities
$CAPABILITIES = Get-WindowsCapability -Online
ForEach ($ITEM in $CAPABILITIES) {
if($ITEM.State -eq "Installed") {
Log "Capability $($ITEM.Name) is installed"
Add-Content -Path $CAP_PATH -Value $ITEM.Name
}
}
# Copy a subset of the Repo files locally, all neutral files and the languages needed
$REPO_FILES = Get-ChildItem $REPO_PATH -file -Recurse
ForEach ($FILE in $REPO_FILES) {
$PATH = ($FILE.DirectoryName + "\") -Replace [Regex]::Escape($REPO_PATH), $LOCAL_REPO_PATH
If (!(Test-Path $Path)) {
New-Item -ItemType Directory -Path $PATH -Force | Out-Null
}
If ((IsLangFile $FILE.Name)) {
# Only copy those files where we need the primary languages from the source OS
ForEach ($ITEM in $LANGUAGES) {
if ($FILE.Name -match $Item) {
If (!(Test-Path (Join-Path $Path $File.Name))) {
Copy-Item $FILE.FullName -Destination $PATH -Force
Log "Copied file $($FILE.FullName) to local repository"
}
else {
Log "File $($FILE.Name) already exists in local repository"
}
}
}
} Else {
# Copy all 'neutral files' and those language specific that are not in the core 38
If (!(Test-Path (Join-Path $Path $File.Name))) {
Copy-Item $FILE.FullName -Destination $PATH -Force
Log "Copied file $($FILE.FullName) to local repository"
}
else {
Log "File $($FILE.Name) already exists in local repository"
}
}
}
Log ("Exiting")
Aggiunta di contenuto facoltativo nel sistema operativo di destinazione
Al termine dell'installazione, viene usato success.cmd per recuperare lo stato del contenuto facoltativo dal sistema operativo di origine e installarlo nel nuovo sistema operativo solo se non è presente. Applicare quindi l'aggiornamento mensile più recente come passaggio finale.
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$LANG_PATH = $OUTPUT_PATH + "sourceLang.txt"
$CAP_PATH = $OUTPUT_PATH + "sourceCapability.txt"
$OSVERSION_PATH = $OUTPUT_PATH + "sourceVersion.txt"
$LOCAL_REPO_PATH = $OUTPUT_PATH + "Local_Repo\"
$LCU_PATH = $OUTPUT_PATH + "Windows10.0-KB4565503-x64_PSFX.cab"
$PENDING = $false
Function Get-TS { return "{0:HH:mm:ss}" -f (Get-Date) }
Function Log
{
param (
[Parameter(Mandatory=$True)]
[string]$MESSAGE
)
$M = "$(Get-TS): PostInstall: $MESSAGE"
Write-Host $M
Add-Content -Path $LOG_PATH -Value $M
}
Log "Starting"
# Get OS version
$OSINFO = Get-CimInstance Win32_OperatingSystem
Log "OS Version: $($OSINFO.Version)"
# Check for source OS state, just to be sure
if (!(Test-Path $LANG_PATH) -or !(Test-Path $CAP_PATH) -or !(Test-Path $OSVERSION_PATH) ) {
Log "Source OS state is missing."
}
# If this script is executing and the OS version hasn't changed, let's exit out.
else {
# Retrive OS version from source OS
$SOURCE_OSVERSION = Get-Content -Path $OSVERSION_PATH
if ($OSINFO.Version -eq $SOURCE_OSVERSION) {
Log "OS Version hasn't changed."
}
else {
# Retrive language list from source OS
$SOURCE_LANGUAGES = Get-Content -Path $LANG_PATH
# Get installed languages from International Settings
$INTL = DISM.exe /Online /Get-Intl /English
# Save System Language, save only output line with default system language
$SYS_LANG = $INTL | Select-String -SimpleMatch 'Default system UI language'
# Replace with null so we have the language code
$SYS_LANG = $SYS_LANG | ForEach-Object {$_.Line.Replace("Default system UI language : ","")}
# Get and save installed packages, we'll use this for debugging
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
if($ITEM.PackageState -eq "Installed") {
Log "Package $($ITEM.PackageName) is installed"
}
}
# Loop through source OS languages, and install if missing on target OS
ForEach ($SOURCE_ITEM in $SOURCE_LANGUAGES) {
if ($SOURCE_ITEM -ne $SYS_LANG) {
# add missing languages except the system language
Log "Adding language Microsoft-Windows-Client-Language-Pack_x64_$($SOURCE_ITEM).cab"
try {
Add-WindowsPackage -Online -PackagePath "$($LOCAL_REPO_PATH)\Microsoft-Windows-Client-Language-Pack_x64_$($SOURCE_ITEM).cab" -ErrorAction stop | Out-Null
}
catch {
Log $_.Exception.Message
}
}
}
# Retrieve capabilities from source OS and target OS
$SOURCE_CAPABILITIES = Get-Content -Path $CAP_PATH
$CAPABILITIES = Get-WindowsCapability -Online
# Loop through source OS capabilities, and install if missing on target OS
ForEach ($SOURCE_ITEM in $SOURCE_CAPABILITIES) {
$INSTALLED = $false
ForEach ($ITEM in $CAPABILITIES) {
if ($ITEM.Name -eq $($SOURCE_ITEM)) {
if ($ITEM.State -eq "Installed") {
$INSTALLED = $true
break
}
}
}
# Add if not already installed
if (!($INSTALLED)) {
Log "Adding capability $SOURCE_ITEM"
try {
Add-WindowsCapability -Online -Name $SOURCE_ITEM -Source $LOCAL_REPO_PATH -ErrorAction stop | Out-Null
}
catch {
Log $_.Exception.Message
}
}
else {
Log "Capability $SOURCE_ITEM is already installed"
}
}
# Add LCU, this is required after adding FODs and languages
Log ("Adding LCU")
Add-WindowsPackage -Online -PackagePath $LCU_PATH -NoRestart
# Get packages, we'll use this for debugging and to see if we need to restart to install
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
Log "Package $($ITEM.PackageName) is $($ITEM.PackageState)"
if ($ITEM.PackageState -eq "InstallPending") {
$PENDING = $true
}
}
}
}
# Remove local repository and state files
Remove-Item -Path $LANG_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $CAP_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $OSVERSION_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $LOCAL_REPO_PATH -Force -Recurse -ErrorAction ignore | Out-Null
# Restarting the computer to let setup process to exit cleanly
if ($PENDING) {
Log ("Install pending packages exists, restarting in 10 seconds")
Start-Process -FilePath cmd -ArgumentList "/C shutdown /r /t 10 /f"
}
Log ("Exiting")