更新中のオプションの Windows コンテンツの移行と取得

この記事では、オペレーティング システムの更新中に言語リソースとオンデマンド機能を維持する問題の背景について説明し、短期的に前進し、長期的な準備をするのに役立つガイダンスを提供します。

オペレーティング システムを更新するときは、言語リソースとオンデマンド機能 (FOD) を保持することが重要です。 多くの商用組織は、Configuration Managerやその他の管理ツールを使用して、ローカル Windows イメージまたは WIM ファイル (メディア ベースまたはタスク シーケンス ベースの更新プログラム) を使用して Windows クライアントのセットアップを配布および調整します。 承認された Windows クライアント機能更新プログラムを使用して、Windows Server Update Services (WSUS)、Configuration Manager、または同等のツール (サービス ベースの更新プログラム) を使用して、インプレース更新を行うものもあります。

どちらの方法にも、ユーザーのデバイスが必要とする可能性がある Windows オプション機能の完全なセットが含まれていないため、これらの機能は新しいオペレーティング システムに移行されません。 以前は、これらの機能は、機能の更新後にオンプレミスで取得するために、Configuration Managerや WSUS では使用できませんでした。

省略可能なコンテンツとは

オプションのコンテンツには、次のものが含まれます。

  • 一般的なオンデマンド機能は、FOD とも呼ばれます (たとえば、Windows Mixed Reality)
  • 言語ベースおよび地域の FOD (例: Language.Basic~~~ja-jp~0.0.1.0)
  • ローカル エクスペリエンス パック
  • 言語パック

オプションのコンテンツは、ボリューム ライセンス サービス センター (VLSC) で使用できるオペレーティング システム メディアの一部である Windows イメージ ファイルには既定では含まれません。 代わりに、VLSC 上の追加の ISO ファイルとしてリリースされます。 これらの機能をオペレーティング システム メディアから出荷し、個別に配布すると、Windows のディスク占有領域が減ります。 この方法では、ユーザーのデータに対してより多くの領域が提供されます。 また、毎月の品質更新プログラムをインストールする場合も、新しいバージョンにアップグレードする場合でも、オペレーティング システムの保守に必要な時間を短縮します。 既定の Windows イメージが小さいほど、ネットワーク経由で送信するデータが少なくなります。

オプションのコンテンツを取得するのが難しいのはなぜですか?

省略可能なコンテンツを取り巻く課題は、通常、次の 2 つのグループに分類されます。

オペレーティング システムの更新プログラムが不完全

最初の課題は、機能の更新中のコンテンツの移行に関連しています。 Windows セットアップがインプレース更新を実行すると、新しいオペレーティング システムがユーザーのディスクに書き込まれ、一時フォルダー内の古いバージョンと共に、2 つ目のクリーン オペレーティング システムがインストールされ、ユーザーが移動できるように準備されます。 操作が行われると、Windows セットアップは現在のバージョンに既にインストールされているオプションのコンテンツを列挙し、このコンテンツの新しいバージョンを新しいオペレーティング システムにインストールする予定です。

Windows セットアップでは、オプションのコンテンツにアクセスする必要があります。 省略可能なコンテンツは既定では Windows イメージに含まれていないため、Windows セットアップは、Windows パッケージを取得し、ステージングしてから、新しいオペレーティング システムにインストールするために、他の場所を検索する必要があります。 コンテンツが見つからない場合、その結果、デバイスの機能が不足している更新プログラム、不満を感じるエンド ユーザー、およびヘルプ デスクの呼び出しが発生する可能性があります。 この問題点は、 更新中にオプションコンテンツを移行できないと呼ばれることもあります。 メディア ベースの更新プログラムの場合、新しいオペレーティング システムが起動すると、Windows は自動的に再試行します。 この 潜在的な取得と呼びます。

ユーザーが開始した機能取得エラー

2 つ目の課題は、ユーザーが要求したときに機能を取得できないという問題です。 クリーンインストールまたはインプレース更新プログラムを使用して、新しいバージョンの Windows クライアントでデバイスを実行しているユーザーを想像してください。 ユーザーが [設定] にアクセスし、第 2 言語、より多くの言語エクスペリエンス機能、またはその他のオプション コンテンツのインストールを試みます。 ここでも、これらの機能はオペレーティング システム内にないため、パッケージを取得する必要があります。 インターネット にアクセスできる一般的なユーザーの場合、Windows は近くの Microsoft コンテンツ配信ネットワークから機能を取得し、すべてが設計どおりに機能します。 商用ユーザーの場合、インターネットにアクセスできないユーザーや、インターネット経由での取得を防ぐためのポリシーを持つユーザーもいます。 このような状況では、Windows は別の場所からコンテンツを取得する必要があります。 コンテンツが見つからないと、ユーザーは不満を感じ、別のヘルプ デスクの呼び出しが発生する可能性があります。 この問題点は、 省略可能なコンテンツを取得できないと呼ばれることもあります。

オプション コンテンツを取得するためのオプション

ほとんどの商業組織は、上記の問題点を理解しており、通常、これらの課題に対処するために利用可能な計画を尋ねることから始まります。 次の表には、現在 Windows クライアントを展開している方法に応じて、考慮すべき複数のオプションが含まれています。 テーブル見出しでは、次の定義が使用されます。

  • 移行: 更新中のオプションのコンテンツ移行をサポートします。
  • 取得: オプションのコンテンツ取得 (つまり、ユーザーが開始) をサポートします。
  • メディア: メディア ベースのデプロイに適用されます。
  • サービス: サービス ベースの展開に適用されます。
メソッド 移行 Acquisition メディア サービス
オプション 1: Windows Updateを使用する はい はい なし はい
オプション 2: UUP 統合で WSUS を使用する はい なし
オプション 3: 動的更新を有効にする はい なし はい はい
オプション 4: 展開前に Windows イメージをカスタマイズする はい なし なし
オプション 5: デプロイ中に言語機能をインストールする 一部 なし なし
オプション 6: デプロイ後にオプションのコンテンツをインストールする なし
オプション 7: オンデマンド機能の代替ソースを構成する なし 一部 はい

オプション 1: Windows Updateを使用する

Windows Update for Business では、オプションのコンテンツの問題が解決されます。 オプションのコンテンツは、近くの Microsoft コンテンツ配信ネットワークから Windows セットアップによって公開され、取得可能であり、統合更新プラットフォームを使用して取得されます。 オプションのコンテンツの移行と取得のシナリオは、Windows Updateやビジネス向けWindows Updateなど、統合更新プラットフォームを使用する更新サービスにデバイスが接続されている場合にだけ機能します。 何らかの理由で更新中に言語パックのインストールに失敗した場合、更新プログラムは自動的にロールバックされます。

統合更新プラットフォームは、基になる Windows 更新テクノロジの機能強化であり、ダウンロード サイズが小さくなり、更新プログラムのチェック、必要なパッケージの取得とインストール、1 回の更新ステップで最新の状態を取得するためのより効率的なプロトコルが実現します。 このテクノロジは、Windows クライアント、Windows Server、および HoloLens などのその他の製品の更新スタックをまとめるため、 統合されています

ビジネス向けWindows Updateに移行することを検討してください。 オプションのコンテンツ シナリオがシームレスに機能するだけでなく (現在のコンシューマー デバイスの場合と同様)、ダウンロード サイズを小さくする利点も最大限に活用できます。 さらに、オペレーティング システムのインストール言語が誤って新しい言語に変更された場合、デバイスは Windows のアップグレードの課題に対して影響を受けません。 そうしないと、インストール メディアのインストール言語が異なる場合、今後のメディア ベースの機能更新プログラムが失敗する可能性があります。 この問題の詳細については、「インストール メディアが元の OS インストール言語とは異なるWindows 10デバイスのアップグレード」および「Ignite 2019 シアター セッション THR4002」を参照してください。

オプション 2: UUP 統合で WSUS を使用する

2023 年 3 月から、UUP は WSUS と統合され、Configuration Manager、オンプレミス管理ソリューションにWindows Updateの同じオプション コンテンツと取得の利点をもたらします。 次に、例を示します。

  • 承認されたWindows 11バージョン 22H2 クライアント機能更新プログラムを WSUS から使用して、インプレース更新を実行するデバイスに対して FOD と言語が自動的に移行されます。 同様に、組み合わされた累積的な更新プログラム、セットアップ更新プログラム、セーフ OS 更新プログラムなどの更新プログラムが含まれ、機能更新プログラムが承認された月に基づいて現在の更新プログラムが含まれます。

  • ローカル Windows イメージを使用してアップグレードするが、WSUS またはConfiguration Managerを使用して組み合わされた累積的な更新プログラムを承認するデバイスは、更新された Windows OS でのオプションのコンテンツ取得と OS の自己修復をサポートすることでメリットがあります。

これを有効にするために必要なコンテンツは、インターネット接続を必要とするクライアント エンドポイントなしで、WSUS またはConfiguration Manager経由で取得されます。 この改善を有効にするには、主要な Windows リリースごとに 1 回、WSUS コンテンツ ディレクトリまたは配布ポイントへの大幅なダウンロードが必要です。 これには、FOD と言語の取得をサポートするパッケージと、破損による OS の自己修復を可能にするパッケージが含まれます。 詳細については、「 WSUS の展開を計画する」を参照してください。

オプション 3: 動的更新を有効にする

Windows Updateに移行する準備ができていない場合は、機能の更新中に動的更新を有効にすることもできます。 メディア ベースの更新プログラムまたは WSUS ベースの機能更新プログラムを使用した場合でも、Windows 機能の更新が開始されるとすぐに、動的更新プログラムが呼び出される最初の手順の 1 つです。 Windows セットアップは、Microsoft がホストするインターネットに接続する URL に接続して動的更新プログラムのコンテンツをフェッチし、オペレーティング システムのインストール メディアにそれらの更新プログラムを適用します。 取得したコンテンツには、次のものが含まれます。

  • セットアップ更新プログラム: 機能更新プログラムに使用するバイナリまたはファイルを Setup.exe する修正。
  • 安全な OS 更新プログラム: Windows 回復環境 (WinRE) の更新に使用される 安全な OS の修正。
  • サービス スタック更新プログラム: Windows サービス スタックの問題に対処するために必要であり、機能更新プログラムを完了するために必要な修正。
  • 最新の累積的な更新プログラム: 最新の累積的な品質更新プログラムをインストールします。
  • ドライバーの更新: 製造元によって既にWindows Updateに公開されており、動的更新プログラム専用の最新バージョンの該当するドライバー。

新しいオペレーティング システム用のこれらの更新プログラムに加えて、動的更新プログラムは更新プロセス中にオプションのコンテンツを取得して、更新が完了したときにデバイスにこのコンテンツが存在することを確認します。 そのため、デバイスはWindows Updateに接続されていませんが、近くの Microsoft コンテンツ ダウンロード ネットワーク (CDN) からコンテンツをフェッチします。 このアプローチは、ユーザーが開始した取得ではなく、オプションのコンテンツを含む最初の問題点に対処します。 既定では、 動的更新は Windows セットアップで有効になっています。 動的更新を有効または無効にするには、Windows セットアップで /DynamicUpdate オプションを使用します。 サービス ベースのアプローチを使用する場合は、 でこの値を setupconfig.ini設定できます。 詳細については、「 Windows セットアップオートメーションの概要 」を参照してください。

動的更新は、追加のオプションを使用して構成できます。 たとえば、最新の品質更新プログラムを自動的に取得せずに、オプションのコンテンツ移行の利点を得ることができます。 これを行うには、Windows セットアップの /DynamicUpdate NoLCU オプションを使用します。 その後、毎月の更新プログラムをテストして承認するために、既存のプロセスに個別に従います。 この方法の欠点は、機能の更新中に使用できなかったため、最新の累積的な更新プログラムのデバイスが再度再起動される点です。

動的更新を使用する場合のもう 1 つの考慮事項は、ネットワークへの影響です。 この方法の最も重要な障害の 1 つは、各デバイスが Microsoft からこのコンテンツを個別にフェッチするという懸念です。 セットアップでは、配信の最適化 (使用可能な場合) を使用して動的更新コンテンツをダウンロードします。 インターネットに接続されていないデバイスの場合は、WSUS と Microsoft カタログを使用して動的更新コンテンツのサブセットを使用できます。

オプション 4: 展開前に Windows イメージをカスタマイズする

多くの組織では、展開ワークフローには、メディア ベースの更新を実行するConfiguration Manager タスク シーケンスが含まれます。 一部のお客様は、インターネット接続を持っていないか、接続が悪いため、動的更新を有効にできません。 このような場合は、展開の前にオプションのコンテンツをインストールすることをお勧めします。 このアクティビティは、インストール メディアのカスタマイズと呼ばれることもあります。

Windows イメージは、次の方法でカスタマイズできます。

  • 累積的な更新プログラムの適用
  • サービス スタックへの更新プログラムの適用
  • 機能更新プログラムに使用する Setup.exe バイナリまたはその他のファイルに更新プログラムを適用する
  • Windows 回復環境に使用される 安全なオペレーティング システム (SafeOS) の更新プログラムの適用
  • 言語の追加または削除
  • オンデマンド機能の追加または削除

このオプションの利点は、Windows イメージに、イメージの 1 回限りの更新を通じて、これらの追加の言語、言語エクスペリエンス機能、およびその他のオンデマンド機能を含めることができるということです。 その後、既存のタスク シーケンスまたはカスタムデプロイ Setup.exe で使用できます。 この方法の欠点は、追加のパッケージをインストールするために DISM を使用したスクリプト作成など、事前にイメージの準備が必要であるということです。 また、イメージは、それを使用するすべてのデバイスで同じであり、一部のユーザーが必要とするよりも多くの機能が含まれている可能性があることを意味します。 メディアのカスタマイズの詳細については、「Dynamic Update パッケージを使用したWindows 10 メディアの更新」および「Ignite 2019 シアター セッション THR3073」を参照してください。 動的更新と同様に、省略可能なコンテンツを移行するためのソリューションは引き続き用意されていますが、ユーザーが開始したオプションコンテンツの取得はサポートされていません。 また、インストールの直前に デバイス でメディアが更新されるこのオプションにはバリエーションがあります。 このオプションを使用すると、現在インストールされている内容に基づいてデバイス固有のイメージをカスタマイズできます。

オプション 5: デプロイ中に言語機能をインストールする

アップグレード中にオプションコンテンツを移行できない最初の問題に対処するための部分的な解決策は、アップグレードプロセス中にオプションコンテンツのサブセットを挿入することです。 この方法では、Windows セットアップ オプション /InstallLangPacks を使用して、パッケージを含むフォルダーから言語パックとテキスト音声認識などの言語機能を追加します。 このアプローチにより、IT 担当者はオプションのコンテンツのサブセットを取得し、ネットワーク内でステージングできます。 サービス ベースのアプローチを使用する場合は、 を使用して setupconfig.iniInstallLangPacks を構成できます。 詳細については、「 Windows セットアップオートメーションの概要」を参照してください。

セットアップを実行すると、インストール中にこれらのパッケージが新しいオペレーティング システムに挿入されます。 これは、展開前に動的更新を有効にするか、オペレーティング システム イメージをカスタマイズする代わりに使用できます。 パッケージの名前を変更できないため、この方法に注意する必要があります。 さらに、コンテンツは 2 つの独立したリリース メディアの ISO から提供されます。 重要なのは、FOD ISO からフォルダーに FOD パッケージと FOD メタデータ .cab の両方をコピーし、LPLIP ISO からアーキテクチャ固有の Language Pack .cab ファイルをコピーすることです。 InstallLangPacks エラーは致命的として扱われ、アップグレード全体がロールバックされます。 メディア ベースのアップグレードでは FOD と言語が移行されないため (動的更新が有効になっていない限り)、ユーザーの状態が悪くならずにするという考え方です。

このアプローチには、いくつかの興味深い利点があります。 元の Windows イメージを変更する必要がないため、時間とスクリプトを節約できる可能性があります。

オプション 6: デプロイ後にオプションのコンテンツをインストールする

このオプションは、展開後にオプションのコンテンツを追加してオペレーティング システム イメージをカスタマイズするという点で、オプション 4 のようになります。 IT 担当者は、機能の更新中と更新後に独自のカスタム アクション スクリプトを実行することで、Windows セットアップの動作を拡張できます。 詳細については、「 機能の更新中にカスタム アクションを実行 する」を参照してください。 この方法では、オペレーティング システムにインストールされているオプションのコンテンツをキャプチャし、この一覧を保存して同じオプション コンテンツを新しいオペレーティング システムにインストールすることで、オプション コンテンツのデバイス固有の移行を作成できます。 オプション 5 と同様に、オプションのコンテンツ パッケージのソースを含むネットワーク共有を内部的にホストします。 次に、デバイスでのセットアップの実行中に、インストールされているオプションのコンテンツの一覧をソース オペレーティング システムからキャプチャして保存します。 後で、セットアップが完了したら、リストを使用してオプションのコンテンツをインストールします。これにより、ユーザーのデバイスは機能を失うことなく残ります。

オプション 7: オプションコンテンツの代替ソースを構成する

いくつかのオプションでは、インプレース更新中にオプションのコンテンツ移行の問題に対処する方法に対処します。 ユーザーが開始したケースで省略可能なコンテンツを簡単に取得する 2 番目の問題点に対処するには、[オプションのコンポーネントのインストールとコンポーネントの修復の設定を指定する] グループ ポリシーを使用して、各デバイスを構成できます。 このポリシー設定では、オペレーティング システムの破損の修復や、ペイロード ファイルが削除されたオプション機能を有効にするために使用されるネットワークの場所を指定します。 この方法には、ネットワーク内でホストされるコンテンツが増えるという欠点がありますが (オペレーティング システム イメージに加えて、まだ一部のクライアントに展開している可能性があります)、ネットワーク内のコンテンツを取得する利点があります。 このポリシーに関するいくつかのリマインダー:

  • 代替ソースへのファイル パスは完全修飾パスである必要があります。複数の場所をセミコロンで区切ることができます。
  • この設定では、代替ソース ファイル パスからの言語パックのインストールはサポートされていません。オンデマンド機能のみです。 ポリシーがWindows Updateからコンテンツを取得するように構成されている場合、言語パックが取得されます。
  • この設定が構成または無効になっていない場合、ファイルは既定のWindows Updateの場所 (たとえば、Windows Update for Business や WSUS) からダウンロードされます。

詳細については、「Windows 修復ソースを構成する」および「WSUS またはConfiguration Managerを使用しているときにオンデマンド機能と言語パックを使用できるようにする方法」を参照してください。

その他のリソース

統合更新プラットフォームと、この記事で説明する方法の詳細については、次のリソースを参照してください。

サンプル スクリプト

オプション 4 と 6 には、最も多くのスクリプトが含まれます。 オプション 4 のサンプル スクリプトは既に存在するため、 オプション 6: 展開後のオプション コンテンツのインストールのサンプル スクリプトを見てみましょう。

オプションのコンテンツ リポジトリの作成

開始するには、オプションのコンテンツのリポジトリを構築し、ネットワーク共有上でホストします。 このコンテンツは、各リリースに付属する FOD および言語パックの ISO からのコンテンツのサブセットです。 このリポジトリまたはリポジトリは、DISM /Export を使用して、organizationで必要な FOD のみを使用して構成します。 たとえば、既存のデバイスにインストールされているオプション機能のインベントリを取得するに基づくスーパーセットです。 この場合、Windows Mixed Reality機能は除外されます。 さらに、すべての言語パックをリポジトリのルートにコピーします。

# 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 

ソース オペレーティング システムでの省略可能なコンテンツの保存

ソース オペレーティング システムにオプションのコンテンツ状態を保存するために、オペレーティング システムのインストール前に実行するカスタム アクション スクリプトを作成します。 このスクリプトでは、オプションの機能と言語リソースをファイルに保存します。 また、ソース オペレーティング システムにインストールされている言語に基づいて、必要なファイルのみを含むリポジトリのローカル コピーを作成します。 この操作により、コピーするファイルが制限されます。

$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")
 

ターゲット オペレーティング システムでの省略可能なコンテンツの追加

セットアップが正常に完了したら、success.cmdを使用してソース オペレーティング システムからオプションのコンテンツの状態を取得し、それが見つからない場合にのみ新しいオペレーティング システムにインストールします。 次に、最後の手順として最新の月次更新プログラムを適用します。

$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")