Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit des informations générales sur le problème de conservation des ressources linguistiques et des fonctionnalités à la demande pendant les mises à jour du système d’exploitation et fournit des conseils pour vous aider à avancer à court terme et à préparer le long terme.
Lorsque vous mettez à jour le système d’exploitation, il est essentiel de conserver les ressources linguistiques et les fonctionnalités à la demande (FOD). De nombreuses organisations commerciales utilisent Configuration Manager ou d’autres outils de gestion pour distribuer et orchestrer la configuration du client Windows à l’aide d’une image Windows locale ou d’un fichier WIM (mise à jour basée sur un média ou une séquence de tâches). D’autres effectuent des mises à jour sur place à l’aide d’une mise à jour approuvée des fonctionnalités du client Windows à l’aide de Windows Server Update Services (WSUS), de Configuration Manager ou d’outils équivalents (une mise à jour basée sur la maintenance).
Aucune des deux approches ne contient l’ensemble complet des fonctionnalités facultatives Windows dont l’appareil d’un utilisateur peut avoir besoin, de sorte que ces fonctionnalités ne sont pas migrées vers le nouveau système d’exploitation. Auparavant, ces fonctionnalités n’étaient pas disponibles dans Configuration Manager ni dans WSUS pour l’acquisition locale après une mise à jour des fonctionnalités.
Qu’est-ce que le contenu facultatif ?
Le contenu facultatif comprend les éléments suivants :
- Fonctionnalités générales à la demande également appelées FOD (par exemple, Windows Mixed Reality)
- FoDs basés sur la langue et régionaux (par exemple, Language.Basic~~ja-jp~0.0.1.0)
- Packs d’expérience locale
- Modules linguistiques
Le contenu facultatif n’est pas inclus par défaut dans le fichier image Windows qui fait partie du support du système d’exploitation disponible dans le Centre de gestion des licences en volume (VLSC). Au lieu de cela, il est publié sous la forme d’un fichier ISO supplémentaire sur VLSC. L’envoi de ces fonctionnalités hors du support du système d’exploitation et leur envoi séparément réduit l’encombrement disque de Windows. Cette approche offre plus d’espace pour les données de l’utilisateur. Cela réduit également le temps nécessaire pour traiter le système d’exploitation, qu’il s’agisse de l’installation d’une mise à jour qualité mensuelle ou de la mise à niveau vers une version plus récente. Une image Windows par défaut plus petite signifie également moins de données à transmettre sur le réseau.
Pourquoi l’acquisition de contenu facultatif est-elle difficile ?
Les défis liés au contenu facultatif se répartissent généralement en deux groupes :
Mises à jour incomplètes du système d’exploitation
Le premier défi est lié à la migration de contenu pendant une mise à jour des fonctionnalités. Lorsque le programme d’installation de Windows effectue une mise à jour sur place, le nouveau système d’exploitation est écrit sur le disque de l’utilisateur en même temps que l’ancienne version dans un dossier temporaire, où un deuxième système d’exploitation propre est installé et préparé pour que l’utilisateur se déplace. Lorsque l’opération se produit, le programme d’installation de Windows énumère le contenu facultatif déjà installé dans la version actuelle et prévoit d’installer la nouvelle version de ce contenu dans le nouveau système d’exploitation.
Le programme d’installation de Windows a besoin d’accéder au contenu facultatif. Étant donné que le contenu facultatif n’est pas dans l’image Windows par défaut, le programme d’installation de Windows doit rechercher ailleurs pour obtenir les packages Windows, les mettre en place, puis les installer dans le nouveau système d’exploitation. Lorsque le contenu est introuvable, le résultat est une mise à jour qui manque de fonctionnalités sur l’appareil, un utilisateur final frustré et probablement un appel au support technique. Ce point de problème est parfois appelé échec de la migration du contenu facultatif pendant la mise à jour. Pour les mises à jour basées sur le support, Windows réessaye automatiquement une fois le nouveau système d’exploitation démarré. Nous appelons cette acquisition latente.
Échec de l’acquisition de fonctionnalités lancée par l’utilisateur
Le deuxième défi consiste à ne pas acquérir des fonctionnalités lorsqu’un utilisateur les demande. Imaginez un utilisateur exécutant un appareil avec une nouvelle version du client Windows, à l’aide d’une installation propre ou d’une mise à jour sur place. L’utilisateur visite Paramètres et tente d’installer une deuxième langue, d’autres fonctionnalités d’expérience linguistique ou d’autres contenus facultatifs. Là encore, étant donné que ces fonctionnalités ne sont pas dans le système d’exploitation, les packages doivent être acquis. Pour un utilisateur classique disposant d’un accès à Internet, Windows acquiert les fonctionnalités à partir d’un réseau de distribution de contenu Microsoft à proximité, et tout fonctionne comme prévu. Pour les utilisateurs commerciaux, certains peuvent ne pas avoir accès à Internet ou avoir des stratégies pour empêcher l’acquisition sur Internet. Dans ce cas, Windows doit acquérir le contenu à partir d’un autre emplacement. Lorsque le contenu est introuvable, les utilisateurs sont frustrés et un autre appel au support technique peut en résulter. Ce point problématique est parfois appelé échec de l’acquisition de contenu facultatif.
Options d’acquisition de contenu facultatif
La plupart des organisations commerciales comprennent les difficultés décrites ci-dessus, et les discussions commencent généralement par demander quels plans sont disponibles pour relever ces défis. Le tableau suivant inclut plusieurs options à prendre en compte, en fonction de la façon dont vous déployez actuellement le client Windows. Les définitions suivantes sont utilisées dans les en-têtes de table :
- Migration : prend en charge la migration de contenu facultative pendant une mise à jour.
- Acquisition : prend en charge l’acquisition de contenu facultative (c’est-à-dire, initiée par l’utilisateur).
- Média : applicable aux déploiements basés sur un média.
- Maintenance : applicable aux déploiements basés sur la maintenance.
| Méthode | Migration | Acquisition | Media | Maintenance |
|---|---|---|---|---|
| Option 1 : Utiliser Windows Update | Oui | Oui | Non | Oui |
| Option 2 : Utiliser WSUS avec l’intégration UUP | Oui | Oui | Non | Oui |
| Option 3 : Activer la mise à jour dynamique | Oui | Non | Oui | Oui |
| Option 4 : Personnaliser l’image Windows avant le déploiement | Oui | Non | Oui | Non |
| Option 5 : Installer les fonctionnalités de langage pendant le déploiement | Partiel | Non | Oui | Non |
| Option 6 : Installer le contenu facultatif après le déploiement | Oui | Non | Oui | Oui |
| Option 7 : Configurer une autre source pour les fonctionnalités à la demande | Non | Partiel | Oui | Oui |
Option 1 : Utiliser Windows Update
Windows Update stratégies clientes résolvent le problème de contenu facultatif. Le contenu facultatif est publié et disponible pour acquisition par le programme d’installation de Windows à partir d’un réseau de distribution de contenu Microsoft voisin et acquis à l’aide de la plateforme de mise à jour unifiée. Les scénarios facultatifs de migration et d’acquisition de contenu fonctionnent simplement lorsque l’appareil est connecté à un service de mise à jour qui utilise la plateforme de mise à jour unifiée, comme Windows Update ou Windows Update stratégies clientes. Si, pour une raison quelconque, un module linguistique ne parvient pas à s’installer pendant la mise à jour, la mise à jour est automatiquement rétablie.
La plateforme de mise à jour unifiée est une amélioration de la technologie de mise à jour Windows sous-jacente qui se traduit par des tailles de téléchargement plus petites et un protocole plus efficace pour la vérification des mises à jour, l’acquisition et l’installation des packages nécessaires, et la mise à jour en une seule étape de mise à jour. La technologie est unifiée, car elle regroupe la pile de mises à jour pour le client Windows, les Windows Server et d’autres produits, tels que HoloLens.
Envisagez de passer aux stratégies clientes Windows Update. Non seulement le scénario de contenu facultatif fonctionne en toute transparence (comme il le fait pour les appareils grand public aujourd’hui), mais vous bénéficiez également de tous les avantages de tailles de téléchargement plus petites. En outre, les appareils sont à l’abri du défi de la mise à niveau de Windows lorsque la langue d’installation du système d’exploitation est modifiée par inadvertance vers une nouvelle langue. Dans le cas contraire, les futures mises à jour des fonctionnalités basées sur le média peuvent échouer lorsque le support d’installation a une langue d’installation différente. Pour plus d’informations sur ce problème, consultez Mise à niveau d’appareils Windows 10 avec un support d’installation différent de la langue d’installation du système d’exploitation d’origine.
Option 2 : Utiliser WSUS avec l’intégration UUP
À compter de mars 2023, UUP a été intégré à WSUS et Configuration Manager pour apporter les mêmes avantages en matière de contenu facultatif et d’acquisition que Windows Update aux solutions de gestion locales. Par exemple :
Les FOD et les langues sont automatiquement migrés pour les appareils qui effectuent une mise à jour sur place à l’aide d’une mise à jour approuvée des fonctionnalités clientes Windows 11, version 22H2 de WSUS. De même, les mises à jour telles que la mise à jour cumulative combinée, les mises à jour du programme d’installation et les mises à jour du système d’exploitation sécurisé sont incluses et actuelles en fonction du mois où la mise à jour de fonctionnalité a été approuvée.
Les appareils qui effectuent une mise à niveau à l’aide d’une image Windows locale, mais qui utilisent WSUS ou Configuration Manager pour approuver la mise à jour cumulative combinée bénéficient de la prise en charge de l’acquisition de contenu facultative dans le système d’exploitation Windows mis à jour, ainsi que de la réparation automatique du système d’exploitation.
Le contenu requis pour l’activer sera acquis via WSUS ou Configuration Manager, sans que les points de terminaison clients nécessitent une connectivité Internet. Pour permettre cette amélioration, une fois par version majeure de Windows, un téléchargement important vers le répertoire de contenu WSUS ou le point de distribution est nécessaire. Cela inclut des packages pour prendre en charge l’acquisition de foD et de langage, ainsi que des packages pour permettre l’auto-réparation du système d’exploitation en raison d’une corruption. Pour plus d’informations, consultez Planifier votre déploiement WSUS.
Option 3 : Activer la mise à jour dynamique
Si vous n’êtes pas prêt à passer à Windows Update, une autre option consiste à activer la mise à jour dynamique lors d’une mise à jour des fonctionnalités. Dès qu’une mise à jour des fonctionnalités Windows démarre, que ce soit par le biais d’une mise à jour basée sur un média ou d’une mise à jour de fonctionnalités WSUS, la mise à jour dynamique est l’une des premières étapes appelées. Le programme d’installation de Windows se connecte à une URL accessible sur Internet hébergée par Microsoft pour récupérer le contenu de la mise à jour dynamique, puis applique ces mises à jour au support d’installation du système d’exploitation. Le contenu acquis comprend les éléments suivants :
- Mises à jour du programme d’installation : correctifs pour Setup.exe fichiers binaires ou tous les fichiers utilisés par le programme d’installation pour les mises à jour des fonctionnalités.
- Mises à jour du système d’exploitation sécurisé : correctifs pour le système d’exploitation sécurisé utilisé pour mettre à jour l’environnement de récupération Windows (WinRE).
- Mises à jour de la pile de maintenance : correctifs nécessaires pour résoudre le problème de pile de maintenance Windows et donc nécessaires pour terminer la mise à jour des fonctionnalités.
- Dernière mise à jour cumulative : installe la dernière mise à jour de qualité cumulative.
- Mises à jour des pilotes : dernière version des pilotes applicables qui ont déjà été publiés par les fabricants dans Windows Update et destinés spécifiquement à la mise à jour dynamique.
En plus de ces mises à jour pour le nouveau système d’exploitation, la mise à jour dynamique acquiert du contenu facultatif pendant le processus de mise à jour pour s’assurer que l’appareil dispose de ce contenu une fois la mise à jour terminée. Ainsi, bien que l’appareil ne soit pas connecté à Windows Update, il extrait le contenu d’un réseau de téléchargement de contenu (CDN) Microsoft voisin. Cette approche traite le premier point problématique avec du contenu facultatif, mais pas l’acquisition initiée par l’utilisateur. Par défaut, la mise à jour dynamique est activée par le programme d’installation de Windows. Vous pouvez activer ou désactiver la mise à jour dynamique à l’aide de l’option /DynamicUpdate dans le programme d’installation de Windows. Si vous utilisez l’approche basée sur la maintenance, vous pouvez définir cette valeur avec setupconfig.ini. Pour plus d’informations, consultez Vue d’ensemble de l’automatisation de l’installation de Windows .
La mise à jour dynamique peut être configurée avec des options supplémentaires. Par exemple, vous souhaiterez peut-être bénéficier des avantages de la migration de contenu facultative sans acquérir automatiquement la dernière mise à jour qualité. Vous pouvez le faire avec l’option /DynamicUpdate NoLCU du programme d’installation de Windows. Ensuite, vous suivez séparément votre processus existant pour tester et approuver les mises à jour mensuelles. L’inconvénient de cette approche est que l’appareil redémarre à nouveau pour la dernière mise à jour cumulative, car elle n’était pas disponible pendant la mise à jour des fonctionnalités.
Un autre point à prendre en compte lors de l’utilisation de la mise à jour dynamique est l’effet sur votre réseau. L’un des principaux obstacles à cette approche est le souci que chaque appareil récupère séparément ce contenu de Microsoft. Le programme d’installation télécharge le contenu de la mise à jour dynamique à l’aide de l’optimisation de la distribution, le cas échéant. Pour les appareils qui ne sont pas connectés à Internet, un sous-ensemble du contenu de la mise à jour dynamique est disponible à l’aide de WSUS et du catalogue Microsoft.
Option 4 : Personnaliser l’image Windows avant le déploiement
Pour de nombreuses organisations, le workflow de déploiement implique une séquence de tâches Configuration Manager qui effectue une mise à jour basée sur les médias. Certains clients n’ont pas de connectivité Internet, ou la connectivité est médiocre et ne peuvent donc pas activer la mise à jour dynamique. Dans ce cas, nous vous recommandons d’installer le contenu facultatif avant le déploiement. Cette activité est parfois appelée personnalisation du support d’installation.
Vous pouvez personnaliser l’image Windows des manières suivantes :
- Application d’une mise à jour cumulative
- Application de mises à jour à la pile de maintenance
- Application de mises à jour à
Setup.exedes fichiers binaires ou à d’autres fichiers que le programme d’installation utilise pour les mises à jour des fonctionnalités - Application de mises à jour pour le système d’exploitation sécurisé (SafeOS) utilisé pour l’environnement de récupération Windows
- Ajout ou suppression de langues
- Ajout ou suppression de fonctionnalités à la demande
L’avantage de cette option est que l’image Windows peut inclure ces langues supplémentaires, ces fonctionnalités d’expérience linguistique et d’autres fonctionnalités à la demande par le biais de mises à jour ponctuelles de l’image. Vous pouvez ensuite les utiliser dans une séquence de tâches existante ou un déploiement Setup.exe personnalisé où est impliqué. L’inconvénient de cette approche est qu’elle nécessite une certaine préparation de l’image à l’avance, notamment un script avec DISM pour installer les packages supplémentaires. Cela signifie également que l’image est la même pour tous les appareils qui la consomment et qu’elle peut contenir plus de fonctionnalités que certains utilisateurs n’en ont besoin. Pour plus d’informations sur la personnalisation de votre média, consultez Mise à jour de Windows 10 média avec des packages de mise à jour dynamique. En outre, comme la mise à jour dynamique, vous disposez toujours d’une solution pour la migration de contenu facultatif, mais ne prenant pas en charge l’acquisition de contenu facultatif initiée par l’utilisateur. En outre, il existe une variante de cette option dans laquelle le média est mis à jour sur l’appareil juste avant l’installation. Cette option permet la personnalisation de l’image spécifique à l’appareil en fonction de ce qui est actuellement installé.
Option 5 : Installer les fonctionnalités de langage pendant le déploiement
Une solution partielle pour résoudre le premier problème lié à l’échec de la migration du contenu facultatif pendant la mise à niveau consiste à injecter un sous-ensemble de contenu facultatif pendant le processus de mise à niveau. Cette approche utilise l’option d’installation de Windows /InstallLangPacks pour ajouter des modules linguistiques et des fonctionnalités linguistiques telles que la reconnaissance vocale à partir d’un dossier qui contient les packages. Cette approche permet à un professionnel de l’informatique de prendre un sous-ensemble de contenu facultatif et de les placer dans son réseau. Si vous utilisez l’approche basée sur la maintenance, vous pouvez configurer InstallLangPacks à l’aide setupconfig.inide . Pour plus d’informations, consultez Vue d’ensemble de l’automatisation de l’installation de Windows.
Lorsque le programme d’installation s’exécute, il injecte ces packages dans le nouveau système d’exploitation pendant l’installation. Il peut s’agir d’une alternative à l’activation de la mise à jour dynamique ou à la personnalisation de l’image du système d’exploitation avant le déploiement. Vous devez prendre soin de cette approche, car les packages ne peuvent pas être renommés. En outre, le contenu provient de deux ISO multimédias de mise en production distinctes. La clé consiste à copier les packages FOD et les métadonnées FOD .cab à partir de l’ISO FOD dans le dossier, et le module linguistique spécifique à l’architecture .cab fichiers à partir de l’ISO LPLIP. Nous considérons les échecs InstallLangPacks comme irrécupérables et nous rétablissons l’ensemble de la mise à niveau. L’idée est de ne pas laisser l’utilisateur dans un mauvais état, car les mises à niveau basées sur le média ne migrent pas les FOD et les langues (sauf si la mise à jour dynamique est activée).
Cette approche présente des avantages intéressants. L’image Windows d’origine n’a pas besoin d’être modifiée, ce qui permet de gagner du temps et de générer des scripts.
Option 6 : Installer le contenu facultatif après le déploiement
Cette option est semblable à l’option 4 dans le cas où vous personnalisez l’image du système d’exploitation avec du contenu plus facultatif après son déploiement. Les professionnels de l’informatique peuvent étendre le comportement de l’installation de Windows en exécutant leurs propres scripts d’action personnalisés pendant et après une mise à jour des fonctionnalités. Pour plus d’informations, consultez Exécuter des actions personnalisées pendant la mise à jour des fonctionnalités . Avec cette approche, vous pouvez créer une migration de contenu facultatif spécifique à l’appareil en capturant le contenu facultatif installé dans le système d’exploitation, puis en enregistrant cette liste pour installer le même contenu facultatif dans le nouveau système d’exploitation. Comme l’option 5, vous hébergeriez en interne un partage réseau qui contient la source des packages de contenu facultatifs. Ensuite, pendant l’exécution du programme d’installation sur l’appareil, capturez la liste des contenus facultatifs installés à partir du système d’exploitation source et enregistrez-le. Plus tard, une fois l’installation terminée, vous utiliserez la liste pour installer le contenu facultatif, ce qui laisse l’appareil de l’utilisateur sans perte de fonctionnalités.
Option 7 : Configurer une autre source pour le contenu facultatif
Plusieurs options permettent de résoudre les problèmes de migration de contenu facultatifs lors d’une mise à jour sur place. Pour résoudre le deuxième problème qui consiste à acquérir facilement du contenu facultatif dans le cas initié par l’utilisateur, vous pouvez configurer chaque appareil à l’aide de la stratégie de groupe Spécifier les paramètres pour l’installation facultative des composants et la réparation des composants. Ce paramètre de stratégie spécifie les emplacements réseau qui seront utilisés pour la réparation de l’altération du système d’exploitation et pour l’activation des fonctionnalités facultatives dont les fichiers de charge utile ont été supprimés. Cette approche présente l’inconvénient d’héberger davantage de contenu dans votre réseau (en plus de l’image de système d’exploitation que vous déployez peut-être encore sur certains clients), mais présente l’avantage d’acquérir du contenu au sein de votre réseau. Quelques rappels sur cette stratégie :
- Le chemin d’accès au fichier de l’autre source doit être un chemin d’accès complet ; plusieurs emplacements peuvent être séparés par un point-virgule.
- Ce paramètre ne prend pas en charge l’installation des modules linguistiques à partir d’un autre chemin d’accès de fichier source, mais uniquement les fonctionnalités à la demande. Si la stratégie est configurée pour acquérir du contenu à partir de Windows Update, les modules linguistiques sont acquis.
- Si ce paramètre n’est pas configuré ou désactivé, les fichiers sont téléchargés à partir de l’emplacement de Windows Update par défaut, par exemple Windows Update stratégies clientes ou WSUS.
Pour plus d’informations, consultez Configurer une source de réparation Windows et Comment rendre les fonctionnalités à la demande et les modules linguistiques disponibles lorsque vous utilisez WSUS ou Configuration Manager.
Autres ressources
Pour plus d’informations sur la plateforme de mise à jour unifiée et les approches décrites dans cet article, consultez les ressources suivantes :
- Planifier votre déploiement WSUS
- /InstallLangPacks
- /DynamicUpdate
- Configurer une source de réparation Windows
- Exécuter des actions personnalisées pendant la mise à jour des fonctionnalités
- Plateforme de mise à jour unifiée
- Mise à jour du support d’installation Windows avec des packages de mise à jour dynamique
- Vue d’ensemble de l’automatisation de l’installation de Windows
Exemples de scripts
Les options 4 et 6 impliquent le plus de scripts. Des exemples de scripts pour l’option 4 existent déjà. Examinons donc les exemples de scripts pour l’option 6 : Installer le contenu facultatif après le déploiement.
Création d’un référentiel de contenu facultatif
Pour commencer, nous créons un référentiel de contenu facultatif et un hôte sur un partage réseau. Ce contenu est un sous-ensemble de contenu provenant des ISO foD et des modules linguistiques fournis avec chaque version. Nous configurons ce dépôt ou référentiel avec uniquement les FOD dont notre organization a besoin, à l’aide de DISM /Export. Par exemple, un sur-ensemble basé sur l’inventaire des fonctionnalités facultatives installées sur les appareils existants. Dans ce cas, nous excluons la fonctionnalité Windows Mixed Reality. En outre, nous copieons tous les modules linguistiques à la racine du dépôt.
# 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
Enregistrement du contenu facultatif dans le système d’exploitation source
Pour enregistrer l’état du contenu facultatif dans le système d’exploitation source, nous créons un script d’action personnalisé à exécuter avant l’installation du système d’exploitation. Dans ce script, nous enregistrons les fonctionnalités facultatives et les ressources de langage dans un fichier. Nous effectuons également une copie locale du référentiel avec uniquement les fichiers nécessaires en fonction des langues installées sur le système d’exploitation source. Cette action limite les fichiers à copier.
$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")
Ajout de contenu facultatif dans le système d’exploitation cible
Une fois l’installation terminée, nous utilisons success.cmd pour récupérer l’état du contenu facultatif à partir du système d’exploitation source et l’installer dans le nouveau système d’exploitation uniquement si cela est manquant. Ensuite, appliquez la dernière mise à jour mensuelle comme dernière étape.
$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")