Azure VMにおけるSysprepのエラーを解決する

パーソルクロステクノロジーの内田です。
Sysprepで生じるユーザ領域にインストールされたアプリケーションに関するエラーについて、解決方法を記載いたします。

Sysprepエラーの概要について

まず当該エラーについてですが、Microsoft Storeアプリに起因しています。
そもそもWindows イメージにはいくつかの組み込みのMicrosoft Storeアプリが存在しています。
プロビジョニング済みアプリと呼ぶのですが、これは対象となるアプリケーションがステージングされており、ユーザがログインすると自動的にインストールするようにスケジュールされています。

プロビジョニングされているアプリと、ユーザにインストールされているアプリケーションで整合性が取れていない場合にSysprepは失敗します。例えば以下のシナリオです。
・プロビジョニングされていないアプリがユーザにインストールされている
・事前にプロビジョニングされているアプリであっても、それが更新されている
・特定のユーザのみでアプリがインストールされている

この制限に抵触しないようにするためのガイダンスとして提供されている情報は以下となります。
・インターネット接続を遮断する
・監査モードで自動更新を無効にする

マスタイメージを日本語化したり、Windows Updateを適用したり、任意のアプリケーションをインストールしたりで、インターネットとの接続を遮断するのは現実的でない場合があります。
※監査モードについては私が勉強不足のため、それによる影響範囲がよくわからないため無視します。

エラー解消方法パターン①

そのため、該当エラーによってSysprepが失敗する場合には以下のコマンドを用いてアプリケーションの実体となるパッケージや、プロビジョニングされているパッケージをアンインストールする対応を取ることになります。
Sysprep実行のたびにログを確認して、一つ一つ削除するのは大変ですので、通常以下のコマンドでまるっと削除を行います。※多数の削除できないエラーが生じますが経験上無視して問題ないと考えています。

$PackageFullNames = @(Get-AppxPackage -AllUsers | Where PublisherId -eq 8wekyb3d8bbwe).PackageFullName 
foreach ($PackageFullName in $PackageFullNames) { 
  Remove-AppxPackage -Package $PackageFullName -AllUsers
  Remove-AppxProvisionedPackage -Online -PackageName $PackageFullName -AllUsers
} 

稀にPublisherIdが8wekyb3d8bbweでないアプリによってエラーが生じる場合があります。
その場合は「C:\Windows\System32\Sysprep\Panther\setupact.log」を確認し、該当のアプリケーションの削除を行います。

基本的にはこれで当該エラーが解消されるのですが、先日Remove-Appx*のコマンドで削除ができないアプリケーションに遭遇しました。確認したのは以下2つのアプリケーションです。
・Microsoft.SecHealthUI
・Microsoft.DesktopAppInstaller
上記のコマンドで削除ができないアプリケーションはあるのですが、Sysprepの実行を妨げるアプリケーションを削除できないケースは個人的に初めてでした。
※特にMicrosoft.SecHealthUIについてはインターネット接続を遮断した状態でもインストールされてしまい、この方法ではどうしようもありませんでした。

エラー解消方法パターン②

というわけで、もう一つのエラー解消方法について記載します。
Microsoft Storeアプリはユーザログイン時にプロビジョニングアプリがインストールされるということは、冒頭に記載しました。その際アプリはユーザ領域にインストールされます。そのため、ユーザプロファイルを削除してしまえば、該当のアプリケーションについても削除される仕様であると考えられます。

Azure VMにおいては、Azure PortalよりPowershellのコマンドを実行することが可能ですので、そこで以下のコマンドを実行します。

# ユーザプロファイルの削除
@(Get-CimInstance Win32_UserProfile | Where-Object {$_.Special -eq $false}) | Remove-CimInstance

# Sysprepの実行
C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown

成功した場合には、仮想マシンの概要画面からVMが停止したことが確認できるはずです。
もし他の要因でSysprepに失敗している場合には、他の要因が考えられますので「C:\Windows\System32\Sysprep\Panther\setupact.log」で内容を確認してください。

今回はこれで以上となります。

いいね (←参考になった場合はハートマークを押して評価お願いします)
読み込み中...

注意事項・免責事項

※技術情報につきましては投稿日時点の情報となります。投稿日以降に仕様等が変更されていることがありますのでご了承ください。

※公式な技術情報の紹介の他、当社による検証結果および経験に基づく独自の見解が含まれている場合がございます。

※これらの技術情報によって被ったいかなる損害についても、当社は一切責任を負わないものといたします。十分な確認・検証の上、ご活用お願いたします。

※当サイトはマイクロソフト社によるサポートページではございません。パーソルクロステクノロジー株式会社が運営しているサイトのため、マイクロソフト社によるサポートを希望される方は適切な問い合わせ先にご確認ください。
 【重要】マイクロソフト社のサポートをお求めの方は、問い合わせ窓口をご確認ください