前回までで、参照マシンの準備が終わったので、今回は Sysprep でイメージ抽出のための準備をして、イメージの抽出、展開までやっていきたいと思います。

いよいよ今回は最終回を迎えることができるのか!?

 

Sysprep

Sysprep は、日本語では システム準備ツール、と呼ばれます。

では、Sysprep とは一体何を準備するツールなのか?

Windows がインストールされているPCには、通常その PC だけの固有情報を持っています。

例えばセキュリティID (SID) と呼ばれるものは、他の Windows PC と重複しないように割り当てられるようになっており、不正に Windows OS が複製されて他の PC にバラまいたりされることがないようになっています。

このコンピュータ固有の情報が生成を、Specialize と呼びます。

ですがその Specialize された固有情報は、他のPCに展開させる時に問題になります。

Sysprep は、その名の通り、Windows のイメージをキャプチャ出来るように Windows PC の固有情報、例えば SID と呼ばれるセキュリテイID やホスト名、ドライバ関連などを一度クリアして、キャプチャされたWindowsイメージ を他のPCに展開できるようにします。

こういった Windows PC の固有情報をクリアする一連の動作を、一般化(Generalize) と呼んでいます。

 

Sysprep の実行

ここまでの記事で、参照マシンを起動すると、自動的に 監査モード(Audit mode) で起動するようになっていると思います。

参照マシンでのすべての作業を終えたら、イメージをキャプチャすために、コマンドプロンプトから Sysprep コマンド を実行し、一般化した上で参照マシンをシャットダウンさせます。

Sysprep を実行する際に、以前 作成した応答ファイルを確認しておきましょう。

以前の記事では、応答ファイルを2つ作成し、Windows イメージにコピーしました。そしてそれは、次のようにして参照マシンに保存されています。

  1. 監査モード用の応答ファイル
    C:\Windows\Panther\Unattend.xml
  2. OOBE用の応答ファイル
    C:\Recovery\OEM\Unattend-OOBE.xml

今回は、イメージ展開後に OOBE モードで起動させる必要があるので、OOBE用の応答ファイル を指定して Sysprep を実行します。

なので、実際に Sysprep を実行する際のコマンドは以下のようになります。

C:\Windows\System32\Sysprep\sysprep /oobe /generalize /unattend:c:\recovery\oem\Unattend-OOBE.xml /shutdown

 

上記の Sysprep コマンドのオプションの意味は次のようになります。

/OOBE
OOBE モードで起動する。
/Generalize
一般化する(構成パス、Generalize が実施されます)。
/Unattend:応答ファイルのパス
応答ファイルを指定する。
/Shutdown
Sysprep 後、シャットダウンする。

 

この時肝心なのは、必ず /Shutdown を指定するということです。/Reboot というオプションもありますが、この場合は再起動して、即 OOBEモードに入ってしまうので、色々面倒臭いことになります。

仮にもし間違えて、/Reboot してしまった場合は、OOBE中に [Ctrl] + [Shift] + [F3] で再度監査モードに入ってから、Sysprep をもう一度実行してください。

Sysprep を実行すると、Sysprep のプロセスが開始され Windows が一般化されます。

途中、なにも問題がなければ参照マシンはシャットダウンされます。

 

Sysprep に失敗する

Sysprep 失敗時のダイアログ

Sysprep 失敗時のダイアログ

Sysprep 実行時、不幸なことに、以下のようなメッセージを残して Sysprep が失敗するかもしれません。

Sysprep で Windows のインストールを検証できませんでした。詳細については、%WINDIR%\System32\Sysprep\Panther\setupact.log にあるログファイルをを確認してください。問題を解決してから、Sysprep を使用してインストールを再度検証してください。

私をはじめ、多くの人が出くわすかもしれないこのメッセージは、プロビジョニングされていない ストアアプリが Sysprep の一般化の際に問題になって、引き起こされていることがほとんどです。

状況としては、参照マシンで リファレンスとなる環境を作成している時ににインターネットに接続してしまい、Windows Update が適用されたり、ストアアプリの更新が適用される、もしくは自動的にインストールされてしまった場合に起きてしまいます。

参照マシンを作成する回で書いたように、ローカルグループポリシーを変更した状態でインターネットに接続 しておけば、知らないうちにストアアプリが更新されたりしなくて済んで、このようなエラーに出くわすことがないのですが、もしこのようにSysprep に失敗した場合は、ログを確認した上で対処していく必要があります。

先程のダイアログにもあるように、ログファイルは、

%WINDIR%\System32\Sysprep\Panther\setupact.log

にあるとありますが、エラーの情報だけを知りたい場合は、setuperr.log で確認できます。

以下がエラーを起こしているログの抜粋になります。

2020-04-17 11:24:55, Error                 SYSPRP Package 3EA2211E.RICOHDriverUtility_4.6.0.0_x86__fxme7667cy4q4 was installed for a user, but not provisioned for all users. This package will not function properly in the sysprep image.
2020-04-17 11:24:55, Error                 SYSPRP Failed to remove apps for the current user: 0x80073cf2.
2020-04-17 11:24:55, Error                 SYSPRP Exit code of RemoveAllApps thread was 0x3cf2.
2020-04-17 11:24:55, Error                 SYSPRP ActionPlatform::LaunchModule: Failure occurred while executing 'SysprepGeneralizeValidate' from C:\Windows\System32\AppxSysprep.dll; dwRet = 0x3cf2
2020-04-17 11:24:55, Error                 SYSPRP SysprepSession::Validate: Error in validating actions from C:\Windows\System32\Sysprep\ActionFiles\Generalize.xml; dwRet = 0x3cf2
2020-04-17 11:24:55, Error                 SYSPRP RunPlatformActions:Failed while validating Sysprep session actions; dwRet = 0x3cf2
2020-04-17 11:24:55, Error      [0x0f0070] SYSPRP RunDlls:An error occurred while running registry sysprep DLLs, halting sysprep execution. dwRet = 0x3cf2
2020-04-17 11:24:55, Error      [0x0f00d8] SYSPRP WinMain:Hit failure while pre-validate sysprep generalize internal providers; hr = 0x80073cf2

 

ほとんど意味のわからない内容ですが、簡単に言えば上記の一行目のような箇所を探すのが早いです。

XXXX-XX-XX XX:XX:XX, Error SYSPREP Package <パッケージフルネーム> was installed for a user, but not provisioned for all users ..

この、<パッケージフルネーム> は、例えば上記のログであれば、

3EA2211E.RICOHDriverUtility_4.6.0.0_x86__fxme7667cy4q4

を指しており、内容をそのまま直訳すると、

3EA2211E.RICOHDriverUtility_4.6.0.0_x86__fxme7667cy4q4 パッケージはあるユーザー向けにインストールされており、すべてのユーザー向けにプロヴィ所ニングされていません。

となっています。

ちなみにこれは、リコーのプリンタドライバなのですが、他にも例えば、Microsoft の OneNote であれば、パッケージフルネームの部分は

Microsoft.Office.OneNote_16001.14228.20150.0_x64__8wekyb3d8bbwe

のようになります。

この時、各パッケージフルネームの後ろの部分に付いている文字列、fxme7667cy4q48wekyb3d8bbwe は、パブリッシャーIDと呼ばれます。

これらの不要なストアアプリを削除するためには、管理者でPowershell を開きます。

まず、Appx と Dism モジュールを組み込みます。1

Import-Module Appx
Import-Module Dism

 

次に、アプリケーションの一覧を取得します。この時、Where PublisherID -eq fxme7667cy4q4 として、パブリッシャーIDで一覧を絞り込みます。

Get-AppxPackage -AllUser | Where PublisherId -eq 8wekyb3d8bbwe | Format-List -Property PackageFullName,PackageUserInformation

 

すると以下のように応答が返ってきます。

PackageFullName        : 3EA2211E.RICOHDriverUtility_4.7.0.0_x86__fxme7667cy4q4
PackageUserInformation : {S-1-5-21-XXXXXXXX-XXXXXXXXXX-XXXXXXXXX-XXXX [MYDOMAIN\zaturendo]: Installed, S-1-5-21-XXXXX
XXXX-XXXXXXXXX-XXXXXXXXXX-XXXX [someuser]: Staged, S-1-5-21-403224292-4086346903-705460333-50
0 [MYDOMAIN\Administrator]: Staged, S-1-5-21-266299426-561184186-2066588244-500 [Administrator
]: Installed}

 

PackageInformation の詳細に着目します2

ここで、S-1-5-21 から始まるSIDとそのSIDに対応したユーザー名と、その後に、: Installed: Staged といった状態に関する項目があるのですが、このうち、Installed となっているユーザー名を確認しておきます。

パッケージを削除するには、一旦そのユーザーでログオンして削除するか、あるいは、ユーザーアカウントを削除した上で、管理者が削除することができます。

削除は、次のようにします。

Remove-AppxPackage -Package 3EA2211E.RICOHDriverUtility_4.7.0.0_x86__fxme7667cy4q4

 

パッケージ名(-Package)は、フルパッケージ名を指定します。

最後に、以下のようにしてプロビジョニングパッケージを削除します。

Remove-AppxProvisionedPackage -Online -PackageName 3EA2211E.RICOHDriverUtility_4.7.0.0_x86__fxme7667cy4q4

 

このコマンドはもしかすると以下のようにエラーを履くかもしれませんが、気にしなくても良いです。

Remove-AppxProvisionedPackage : 指定されたファイルが見つかりません。
発生場所 行:1 文字:1
+ Remove-AppxProvisionedPackage -Online -PackageName 3EA2211E.RICOHDriv ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Remove-AppxProvisionedPackage], COMException
    + FullyQualifiedErrorId : Microsoft.Dism.Commands.RemoveAppxProvisionedPackageCommand

 

このようにしてストアアプリを削除した後、再度 Sysprep を実行します。

もしさらに失敗した場合、上記の手順を Sysprep が成功するまで繰り返して実行してください3

 

イメージの抽出

参照マシンを Windows PE で起動

さて、参照マシンの Sysprep が成功してシャットダウンしたら、次に USBメモリ(USB-B と Windows PE の入っている) を参照マシンに挿して、Windows PE から起動するように BIOS で設定して起動します。

BIOS メニューに入りそこねて、Windows が OOBEモードで立ち上がってしまったら、面倒くさいですがすかさず [Ctrl] + [Shift] + [F3] を押して、監査モードに入り、Sysprep し直してください。

Windows PE が立ち上がったら、DISKPART コマンドで、ドライブの構成を確認しておきます。

DISKPART> list disk

Disk ###  Status      Size     Free     Dyn  Gpt
--------  ----------  -------  -------  ---  ---
Disk 0    Online       465 GB      0 B        *
Disk 1    Online       112 GB      0 B

 

この例の場合、キャプチャしたいディスクは disk 0 になっているのがわかります。

次に、ボリューム一覧を見てみます。

DISKPART> list vol

Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
----------  ---  -----------  -----  ----------  -------  ---------  --------
Volume 0     F                       DVD-ROM         0 B  No Media
Volume 1     C   Windows      NTFS   Partition    465 GB  Healthy
Volume 2         SYSTEM       FAT32  Partition    100 MB  Healthy    Hidden
Volume 3     D   WINPE        FAT32  Removable   2000 MB  Healthy
Volume 4     E   USB-B        NTFS   Removable    110 GB  Healthy

 

ここでは、USB-B のドライブレター E を控えておきます。環境によって、ドライブレターは変わってきます。

 

参照マシンの Windows イメージをキャプチャする

さて、いよいよイメージのキャプチャを行います。

コマンドはたったの一つです。

DISM.exe /capture-ffu /imagefile=E:\Images\CustomImage.ffu /Name:"Custom Image" /capturedrive=\\.\PhysicalDrive0 /description:"Windows 10 20H2 Custom"

 

ここで使用しているオプションの説明です。

/Capture-FFU
物理ディスクの複数パーティションのイメージを新しい .ffu ファイルにキャプチャします。.ffu ファイルというのは、物理ディスクをまるごとイメージ化したファイル、というふうに捉えておいて間違いはないと思います。今回のように、パーティションを分けたいような場合に使用します。
/imagefile
作成するイメージファイルのパスを指定します。ここでは、USB-B (E:) の Images ディレクトリにイメージを保存します。
/Name
イメージの名前を指定します。
/CaptureDrive
キャプチャする物理ドライブを指定します。Diskpart で控えておいたディスク番号をもとに次のフォーマットで記述します。
/CaptureDrive:\\.\PhysicalDriveX
X は、ディスク番号になります。
/Description
(任意)イメージの説明を指定します。

イメージのキャプチャには少し時間がかかります。

ちなみに、私の環境で、500GB の SSD に Cドライブ、Dドライブとパーティションを切って、そこに

  • ブラウザ(Firefox と Chrome)
  • メールクライアント(Thunderbird)
  • Microsoft Office
  • 基幹ソフト(こちらは Dドライブにインストール)

等諸々インストールして、Capture-FFU でキャプチャすると、およそ 10GB 弱のイメージが作成されました。

USBメモリ の容量を選定する際の参考にしてください。

 

イメージの修正

ここで余談になるのですが、私の環境で起きた不具合に対する対処をここに書いておきたいと思います。

あくまで余談なので、不要な場合は次の「イメージの展開」まで飛ばしていただいてかまいません。

で、不具合の詳細について詳しくは省くんですが、応答ファイルの Specialize 構成パスで設定した CopyProfile = true が悪さをするのか、展開した PC をドメインに参加させて、ドメインのユーザーでログインすると、 ESENT4C:\Users\Administrator\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat にアクセスしようとして拒否される、というイベントが連続して発生し、そのままでは Windows を使ってられないくらい動作が遅くなってしまったのです。

結局いろいろ調べて、WebCache をディレクトリごと削除せよ、という情報が多かったので、それを削除することで問題は解決したのですが、展開のたびにいちいち、WebCache を削除するのも面倒なので、この段階でイメージから削除してみよう、という試みです。

 

イメージのマウント

キャプチャしたイメージを作業用PCでマウントします。

まず、イメージを保存している USBメモリ を作業用PCに挿して、イメージファイル CustomImage.ffu を作業用ディレクトリの Images フォルダにコピーします。

次に、[展開とイメージングツール環境]管理者 として開き、CustomImage.ffu をマウントするのですが、その前にイメージのインデックスを確認します。

まず、作業用ディレクトリに移動します。

cd /d d:\Deployment_work\20h2

 

次に、Dism /Get-Imageinfo を使ってイメージのインデックスを確認します。

dism /Get-ImageInfo /Imagefile:Images\CustomImage.ffu

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.1

イメージの詳細: Images\CustomImage.ffu

インデックス: 1
名前: Custom Image
説明: Windows 10 20H2 Custom
サイズ: 10,102,371,597 バイト

操作は正常に完了しました。

 

当たり前ですが、インデックスは一つしかありません。

後はこのイメージをマウントするだけです。

Dism /Mount-Image /Imagefile:Images\CustomImage.ffu /Index:1 /Mountdir:mount\windows
    :
操作は正常に完了しました。

 

イメージをマウントしたら、該当のディレクトリを削除します。

rmdir /s /q mount\windows\Users\administrator\AppData\Local\Microsoft\Windows\WebCache

 

ディレクトリを削除した後は、`/Commit` オプションを付けてイメージをアンマウントします。

Dism /Unmount-Image /Mountdir:mount\windows /Commit
    :
操作は正常に完了しました。

 

イメージをアンマウントできたら、イメージを USBメモリの USB-B\Images にコピーしておきましょう。

 

イメージの展開

ここまでで、Windows のカスタムイメージが出来上がりました。

あとは、このイメージを他のPCに展開していくだけです。

 

実機に Windows を展開する

USBメモリの USB-B\Images ディレクトリに、キャプチャした Windows イメージがあることを確認しておいてください。

ターゲットとなる PC を USBメモリから起動できるように起動構成を変更しておきます。

そのPCに USBメモリ を挿して起動させると、Windows PE が起動します。

ここで、DISKPARTの list vol コマンドで USB-B のドライブレターを確認します。

例えば、ボリュームが以下のようであるとします。

イメージの展開: ディスク一覧の確認

イメージの展開: ディスク一覧の確認

 

この場合、 USB-BDeployment ディレクトリ、D:\Deployment に移動します。

cd /d D:\Deployment

 

次に、以前も使用した ApplyImage.bat のオプションに、カスタムイメージを渡して実行します。

ApplyImage.bat D:\Images\CaptureImage.ffu

 

実行すると、展開先の物理ディスクの番号を確認してくるので、番号を入力します。

  ディスク      状態           サイズ    空き     ダイナミック  GPT
  -----------  ------------  -------   -------  -----------  ---
  ディスク 0    オンライン      465 GB    465 GB
  ディスク 1    オンライン      112 GB       0 B

DiskPart を終了しています...
Enter the disk number of the drive where you're going to deploy your FFU (usually 0).
(Enter the Disk Number from above):

 

この場合は、disk 0 が内蔵されているストレージなので、0 を指定して、エンターキーを押します。

次に、「ディスク0のデータがすべて削除されます。続けますか?」と確認してくるので、y としてエンターを押します。

This will remove all data from disk 0. Continue?
(Y or N):

 

すると、イメージがPCに展開され始めるので、終わるまで待ちます。

展開が終わると、次のようにリカバリ用パーティションを構成するかどうか確認してくるので、N を入力しエンターを押します。

FFU applied. Would you like to configure the recovery partition?
(Y or N):N

 

以上で、展開作業は終了です。

最後に、USB-B を抜いて、Exit コマンドでPCを再起動します。

再起動後、応答ファイルで設定したように、OOBE のほとんどの項目をすっ飛ばして、何も設定等をすることなく Windows が起動します(途中、一回ほど再起動をはさみます)。

ログイン時の画面をクリックすると、予め応答ファイルで設定しておいたローカルアカウントでログインできるようになっているはずです。

 

まとめ

いやあ、これで、7回に渡って続いた シン・Windows 10 展開用イメージの作成シリーズが、完結です。

時間がかかりましたね。しかもその間に、Windows 11 の発表もありましたし・・

Windows 11 (出典: Microsoft.com)

Windows 11 (出典: Microsoft.com)

 

以前中途半端に終わった、Windows 10 展開用イメージの作成シリーズの失敗を覆せたとおもいます。

気になるのは、Windows 11 ですが、個人的には、セキュリティの強化された Windows 10 と捉えていて、Windows7 から Windows 10 の時のような互換性の問題は発生しないんじゃないか、と勝手に想像しているんですがどうでしょうか。

なので、Windows 10 と同じような方法で展開用イメージの作成ができるのではないか、と無責任な発言をしておきます。

中小企業において、決して少ないとは言えない台数のPCを社内業務向けに構成するのは結構な苦労があると思いますが、一度、展開用のイメージを作成すると、PC のキッティングに要する時間は劇的に改善されるでしょう。

この記事がその一助になれば幸いです。


  1. 環境によってはモジュールはすでに組み込まれているかもしれません。 

  2. 今回の記事の内容に沿って作業をした場合、この例のように Administrator 以外のユーザーが表示されることはありません。 

  3. 悲しいことに、一度の Sysprep ではすべての Sysprep を阻害するストアアプリを検出してくれません・・・ 

  4. Extensible Storage Engine のランタイムらしい。詳しくは知りません。 


 

 
Share this...

zaturendo

中小企業社内SE。

0件のコメント

コメントを残す

Avatar placeholder

メールアドレスが公開されることはありません。