PC のリカバリーへの拡張スクリプトの追加

OEM は、ユーザーが PC のリカバリー機能である [個人用ファイルを保持する] または [すべて削除する] を実行したときに動作するカスタム スクリプトを挿入できます。

拡張スクリプトまたは自動適用フォルダーを使用すると、他の方法では復元されない一般的なカスタマイズを復元できます。たとえば、次のようなものがあります。

  • スタート メニュー
  • タスク バー
  • OOBE
  • Unattend.xml のカスタマイズ

その他、次のようなタスクを実行する場合にも、拡張スクリプトを利用できます。

  • データ パーティションまたはユーティリティ パーティションに変更を加える
  • [個人用ファイルを保持する] の機能では通常維持されないファイルを保存、復元する

Note

自動適用フォルダーを追加した場合、拡張スクリプトを追加することは避けてください。 自動適用フォルダーと拡張スクリプトの両方を追加した場合、自動適用フォルダーは無視されます。

拡張スクリプトの追加について

拡張スクリプトを追加するには、次の概念を理解する必要があります。

  • 拡張ポイント - PC のリカバリー プロセスの過程でカスタム スクリプトを実行できる各種ポイント。
  • 拡張スクリプト - 定義された拡張ポイントで実行されるスクリプト。
  • PC のリカバリー構成ファイル (ResetConfig.xml) - それぞれの拡張ポイントでどのスクリプトを実行するかを定義するファイル。

回復中にスクリプトを有効にする

PC のリカバリーに拡張スクリプトを追加するには、次のものをすべて C:\Recovery\OEM フォルダーに追加します。

  • どのスクリプトを実行するかを定義する PC のリカバリーの構成ファイル (ResetConfig.xml)
  • 拡張スクリプト
  • 拡張スクリプトに必要なファイル

拡張スクリプト

要件:

  • スクリプトのファイル形式が .cmd または .exe であること。
  • 既定の Windows RE イメージ (winre.wim) に存在しない Windows PE のオプション コンポーネントにスクリプトが依存していないこと。
  • 既定の Windows RE イメージ (winre.wim) に存在しないバイナリ (.exe、.dll ファイルなど) にスクリプトが依存していないこと。
  • グラフィカル ユーザー インターフェイス (GUI) を表示せずに動作すること。
  • 拡張ポイントごとに、意図した機能がすべて 5 分以内に完了すること。
  • ドライブ文字を変更しないこと。 回復の失敗につながる可能性があります。
  • 成功した場合に 0 (ゼロ) を返すこと。 PC のリカバリーに 0 以外の値が返された場合、次のステップが実行されます。
    • [個人用ファイルを保持する] の機能が実行されている場合: システムの変更がすべてロールバックされます。 スクリプトまたは実行可能ファイルが Windows の [PC 設定] メニューから開始された場合、システムは Windows で再起動します。 スクリプトまたは実行可能ファイルが Windows RE または [PC の起動をカスタマイズする] メニューから開始された場合、システムは Windows RE のままとなり、エラー メッセージが表示されます。
    • [すべて削除する] 機能が実行されている場合: エラーは無視されます。 スクリプトまたは実行可能ファイルは、リセット プロセスにおける次のステップに進み、エラーがログされます。

PC のリカバリー構成ファイル (ResetConfig.xml)

PC のリカバリーの拡張スクリプトの場所を指定する ResetConfig.xml ファイルを追加します。

このファイルは UTF-8 で保存する必要があります。 ANSI コーディングは使用しないでください。 たとえば、メモ帳で [ファイル] をクリックし、[名前を付けて保存] をクリックします。 [文字コード] ボックスから [UTF-8] を選択します。

このファイルを C:\Recovery\OEM\ResetConfig.xml として保存して Windows イメージにコピーしてください。

同じ ResetConfig.xml ファイルを使用して Windows を構成することにより、リカバリ メディアを作成できます。 詳細については、「PC のリカバリー機能を展開する」を参照してください。

[個人用ファイルを保持する] または [すべて削除する] 操作の始まりと終わり近くに実行されるスクリプトの場所は、4 つある拡張ポイントを使用して指定できます。 以下のサンプル スクリプトに示すように、通常、一般的なカスタマイズで必要となるスクリプトは 1 つだけです。

機能拡張ポイント

以下のステップは、[個人用ファイルを保持する] 機能を要約したものです。

  1. PC が Windows 回復環境 (Windows RE) で起動します。
  2. 拡張ポイント A (BasicReset_BeforeImageApply): ここには、ユーザーが [個人用ファイルを保持する] 機能を実行したときに既定では移行されないファイル、ドライバー、設定をコピーするスクリプトを追加します。
  3. ユーザー アカウント、設定、データが収集されて一時的な場所に移動されます。
  4. Windows コンポーネント ストアからのファイルを使用して、OS の新しいコピーが一時的な場所に構築されます。
  5. その新しい OS に、C:\Recovery\Customizations 下のプロビジョニング パッケージに格納されたカスタマイズが適用されます。
  6. 既存の OS からドライバーがコピーされて新しい OS に挿入されます。
  7. プレインストールされた Windows アプリが、そのバックアップ場所から復元されます。
  8. システムにとって重要な設定が新しい OS に適用されます。
  9. 既存の OS が C:\Windows.old に移動されます。
  10. OS ボリュームのルートに新しい OS が移動されます。
  11. 拡張ポイント B (BasicReset_AfterImageApply): ここには、カスタマイズ ファイル (unattend.xml, layoutmodification.xml) を復元したり、拡張ポイント A にバックアップしたファイルや設定を復元したりするためのスクリプトを追加します。
  12. PC が新しい OS で再起動します。
  13. 初回起動時に、ユーザー データと設定が再適用されます。

以下のステップは、[すべて削除する] 機能を要約したものです。

  1. PC が Windows 回復環境 (Windows RE) で起動します。
  2. ユーザー アカウントとデータ、さらに、インストールされた Windows アプリや Windows デスクトップ アプリケーションが OS ボリュームから削除されます。
  3. データ ボリュームがフォーマットされます (ユーザーによって要求された場合)。
  4. OS ボリュームとデータ ボリュームに対してデータの消去が実行されます (ユーザーによって要求された場合)。
  5. 拡張ポイント C (FactoryReset_AfterDiskFormat): 必要に応じてデータ パーティションを再構成するスクリプトをここに追加します。 重要: Windows パーティションは変更しないでください。
  6. Windows コンポーネント ストアからのファイルを使用して、OS の新しいコピーが一時的な場所に構築されます。
  7. その新しい OS に、C:\Recovery\Customizations 下のプロビジョニング パッケージに格納されたカスタマイズが適用されます。
  8. 既存の OS からドライバーがコピーされて新しい OS に挿入されます。
  9. プレインストールされたユニバーサル Windows アプリが、そのバックアップ場所から復元されます。
  10. 既存の OS が削除されます。
  11. OS ボリュームのルートに新しい OS が移動されます。
  12. 拡張ポイント D (FactoryReset_AfterImageApply): ここには、カスタマイズ ファイル (unattend.xml、layoutmodification.xml) を復元するためのスクリプトを追加します。
  13. PC が新しい OS で再起動します。
  14. OOBE が開始されます。

例: スタート メニュー、タスク バー、OOBE、unattend.xml のカスタマイズを復元する

以下に示したサンプル スクリプトとサンプル ResetConfig.xml ファイルは連携して動作し、Windows 11 における PC のリカバリー過程で、一般的なカスタマイズを復元します。 これらのサンプルを使用して PC のリカバリーをテストできます。 これらのサンプルを使用してテストするには:

  • 次のファイルを C:\Recovery\OEM フォルダーに保存します。
    • サンプル スクリプト (CommonCustomizations.cmd)
    • PC のリカバリー構成ファイル (ResetConfig.xml)
    • スタート メニュー構成ファイル (LayoutModification.json) のコピー
    • タスク バー構成ファイル (TaskbarLayoutModification.xml) のコピー
    • unattend.xml ファイルのコピー

以下に示したサンプル スクリプトとサンプル ResetConfig.xml ファイルは連携して動作し、Windows 10 における PC のリカバリー過程で、一般的なカスタマイズを復元します。 これらのサンプルを使用して PC のリカバリーをテストできます。 これらのサンプルを使用してテストするには:

  • 次のファイルを C:\Recovery\OEM フォルダーに保存します。
    • サンプル スクリプト (CommonCustomizations.cmd)
    • PC のリカバリー構成ファイル (ResetConfig.xml)
    • スタート メニュー構成ファイル (LayoutModification.xml) のコピー
    • タスク バー構成ファイル (TaskbarLayoutModification.xml) のコピー
    • unattend.xml ファイルのコピー
  • OOBE フォルダー全体とそのサブフォルダー (%WINDIR%\System32\Oobe\Info\) を C:\Recovery\OEM\OOBE\Info にコピーします。

CommonCustomizations.cmd

このファイルは、回復した OS に、Recovery フォルダーからカスタマイズ ファイルをコピーします。

rem CommonCustomizations.cmd

rem Define %TARGETOS% as the Windows folder (This later becomes C:\Windows) 
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C

rem Define %TARGETOSDRIVE% as the Windows partition (This later becomes C:)
for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

rem Add back Windows settings, Start menu, Taskbar, and OOBE.xml customizations
copy "%TARGETOSDRIVE%\Recovery\OEM\Unattend.xml" "%TARGETOS%\Panther\Unattend.xml" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\LayoutModification.json" "%TARGETOSDRIVE%\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.json" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\TaskbarLayoutModification.xml" "%TARGETOS%\OEM\TaskbarLayoutModification.xml" /y
xcopy "%TARGETOSDRIVE%\Recovery\OEM\OOBE\Info" "%TARGETOS%\System32\Oobe\Info\" /s

rem Recommended: Create a pagefile for devices with 1GB or less of RAM.
wpeutil CreatePageFile /path=%TARGETOSDRIVE%\PageFile.sys /size=256

EXIT 0
rem CommonCustomizations.cmd

rem Define %TARGETOS% as the Windows folder (This later becomes C:\Windows) 
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C

rem Define %TARGETOSDRIVE% as the Windows partition (This later becomes C:)
for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

rem Add back Windows settings, Start menu, Taskbar, and OOBE.xml customizations
copy "%TARGETOSDRIVE%\Recovery\OEM\Unattend.xml" "%TARGETOS%\Panther\Unattend.xml" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\LayoutModification.xml" "%TARGETOSDRIVE%\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\TaskbarLayoutModification.xml" "%TARGETOS%\OEM\TaskbarLayoutModification.xml" /y
xcopy "%TARGETOSDRIVE%\Recovery\OEM\OOBE\Info" "%TARGETOS%\System32\Oobe\Info\" /s

rem Recommended: Create a pagefile for devices with 1GB or less of RAM.
wpeutil CreatePageFile /path=%TARGETOSDRIVE%\PageFile.sys /size=256

EXIT 0

ResetConfig.xml

Note

この例では、同じスクリプトの場所が 2 回指定されています。つまり、[個人用ファイルを保持する][すべて削除する] のどちらの機能でも使用できます。

<?xml version="1.0" encoding="utf-8"?>
<!-- ResetConfig.xml -->
<Reset>
  <Run Phase="BasicReset_AfterImageApply">
    <Path>CommonCustomizations.cmd</Path>
    <Duration>2</Duration>
  </Run>
  <Run Phase="FactoryReset_AfterImageApply">
    <Path>CommonCustomizations.cmd</Path>
    <Duration>2</Duration>
  </Run>
  <!-- May be combined with Recovery Media Creator
       configurations – insert SystemDisk element here -->
</Reset>

ファイルの保持と取得

[個人用ファイルを保持する] 機能では、サンプル スクリプトを使用することで、他の方法では削除されてしまうようなファイルをメモリ内の一時的な場所に格納することで保持できます。 [すべて削除する] 機能を使用してファイルを保持することはできません。

保存スペースとしては、必要に応じて次の場所を使用できます。

  • Windows PE RAM ドライブ (X:)。 この仮想ドライブは Windows PE によって作成され、[個人用ファイルを保持する] プロセスの間、アクティブ状態に保たれます。 [個人用ファイルを保持する] 機能で使用することにより、パーティションの更新前にデータを保存しておき、パーティションの更新が完了した後でそのデータを復元できます。 使用可能なメモリの量は、完全に展開された Windows RE ツールに必要な RAM の量をシステム上の RAM の容量から差し引いたサイズに制限されます。 Windows RE をマウントする手順、および完全に展開されたファイル サイズを確認する手順については、「Windows RE のカスタマイズ」を参照してください。

  • 指定された OEM パーティション。 パーティションには、追加のスペースを残しておくことができます。 たとえば、回復イメージ パーティションに余裕を持たせておき、スクリプトを使用して一時的にドライブ文字を割り当てた後、そのパーティションにファイルを保存できます。 ただし、ユーザーがリカバリ メディアを使用してディスクのパーティション分割をやり直した場合、回復プロセス中、そのパーティション上のデータは失われます。

これらのサンプル スクリプトは、Windows ログ ファイルを保持するものです。 これらのスクリプトを C:\Recovery\OEM フォルダーに保存してください。

ファイルを保持するサンプル ResetConfig.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- ResetConfig.xml -->
   <Reset>
      <Run Phase="BasicReset_BeforeImageApply">
         <Path>SaveLogFiles.cmd</Path>
         <Duration>4</Duration>
      </Run>      
      <Run Phase="BasicReset_AfterImageApply">
         <Path>RetrieveLogFiles.cmd</Path>
         <Duration>2</Duration>
      </Run>
      <!-- May be combined with Recovery Media Creator
       configurations – insert SystemDisk element here -->
   </Reset>

ファイルを保持するサンプル拡張スクリプト

SaveLogFiles.cmd: メモリ内の一時フォルダーにログ ファイルを保存します。

:rem == SaveLogFiles.cmd

:rem == 1. Use the registry to identify the location of
:rem       the new operating system and the primary hard
:rem       drive. For example, 
:rem       %TARGETOS% may be defined as C:\Windows
:rem       %TARGETOSDRIVE% may be defined as C:
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C

for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

:rem == 2. Copy old Windows logs to a temporary folder in memory
mkdir X:\Temp
xcopy %TARGETOS%\Logs\*.* X:\temp\OldLogs /cherkyi

EXIT 0

ファイルを取得するサンプル拡張スクリプト

RetrieveLogFiles.cmd: SaveLogFiles.cmd スクリプトによってメモリに保存されたファイルを取得します。

:rem == RetrieveLogFiles.cmd

:rem == This sample script retrieves the files that 
:rem    were saved in memory by 
:rem    SaveLogFiles.cmd,
:rem    and adds them back to the system.

:rem == 1. Use the registry to identify the location of
:rem       the new operating system and the primary drive.
:rem        
:rem       %TARGETOS% is the Windows folder 
:rem          (This later becomes C:\Windows)
:rem       %TARGETOSDRIVE% is the Windows partition 
:rem          (This later becomes C:)
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C
for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

:rem == 2. Copy the old logs to the new OS 
:rem       at C:\Windows\OldLogs
mkdir %TARGETOS%\OldLogs
xcopy X:\Temp\OldLogs\* %TARGETOS%\OldLogs /cherkyi

EXIT 0

代替の方法: 展開後にスクリプトをコピーする

ユーザーへの OOBE が完了するとすぐ、回復スクリプトが C:\Recovery\OEM フォルダーから回復パーティション (R:\RecoveryImage\) に移動されます。

万一、この操作が発生する前に PC のリカバリーが使用された場合、これらのスクリプトは実行されません。 そのリスクは、イメージの展開後、回復ファイルを直接回復パーティション R:\RecoveryImage\ にコピーすることで回避できます。

次のステップ

PC のリカバリー エクスペリエンスをカスタマイズしたら、PC のリカバリーの回復イメージ (Install.wim) を回復イメージ パーティションに展開できます。

Diskpart スクリプト、ResetConfig.xml ファイル、PC のリカバリー回復イメージ (install.wim) を対象 PC の回復イメージ パーティションにコピーするには、「PC のリカバリー機能を展開する」トピックの手順に従ってください。

プッシュ ボタン リセットの概要

PC のリカバリー機能を実行するためのメディアの作成

PC のリカバリー機能を展開する

REAgentC コマンド ライン オプション

ResetConfig XML リファレンス