蝉は、やがて死ぬる午後に気づいた。ああ、私たち、もっと仕合せになってよかったのだ。:2019年05月24日分

2019/05/24(Fri)

[Windows] Dismコマンドで永続的パッケージを無理矢理アンインストールする

今家族マシン用に確保してあるWindows 8のDSPライセンスだけど、8をインストールしてパッチ適用してストア経由で8.1にアプグレしてからまたパッチ適用というアホみたいな手順は踏みたくない。 しかしWindows 8.1はサービスパックみたいに単体でWindows 8のインストールイメージに統合できる形式で提供されてないのでアレ。

なのでせっかくMicrosoft公式が

を提供してるので、こいつ使ってクリーンインストールすることにする。 なんせWindows 8のシリアル番号はそのままWindows 8.1のインストールに有効だから利用条件は満たしてるので以下略

ちなみにISOの中身はRTM版ではなくUpdate 3なんだけどそれでも150近いパッチの適用が必要で、Security Rollup適用すれば70程度で済むWindows 7よりひどいことになっている、うーんこの。

そしてしれっと悪名高いKB2976978いわゆるテレメトリパッチが混入しているのがクソ、ワイはパラノイアなので

dism /Image:mount /Remove-Package /PackageName:Package_for_KB2976978~31bf3856ad364e35~amd64~~6.3.2.1

を実行してアンインストールを試みたんだけど

1 / 1 を処理しています - Package_for_KB2976978: 永続的パッケージはアンインストールできません。
 エラー: 0x800f0825

エラー: 0x800f0825

DISM が失敗しました。操作は実行されませんでした。

というエラーが出てアンインストールできねえやんけクソが。

これはなぜかというとシステム回復時にUpdate3の更新ロールアップまでリセットされないように

dism /Image:mount /Cleanup-Image /StartComponentCleanup /ResetBase

を実行してそれらのパッチ(テレメトリまで含めて)に永続化をマークしてるからなのよね、詳しいことは これ読め

ところがこの永続化フラグってのは実にいいかげんなものなようで、もういちどAdd-Packageし直したら外れることが判った。

dism /Image:mount /Add-Package /PackageName:Package_for_KB2976978~31bf3856ad364e35~amd64~~6.3.2.1
dism /Image:mount /Remove-Package /PackageName:Package_for_KB2976978~31bf3856ad364e35~amd64~~6.3.2.1

ポイントはPackagePathではなくPackageNameにインストール済のパッケージ名を指定してAdd-Packageを実行するのがミソ。 もちろんこのKB2976978がベースシステムの置き換えで無い単純な増分でしかないから可能な技で、Cleanup-ImageでWinSxSの下にある古いバージョンは消されちゃった永続的パッケージは削除できないとは思うが。

そんでPowerShellのAdd-WindowsPackageコマンドレットは-PackageNameオプションが無いけれどそれなら-PackagePathを使えばいいじゃないと、最新のKB2976978(今はv24)のパッチをダウンロードしてきて

Add-WindowsPackage -Path .\mount -PackagePath .\windows8.1-kb2976978-v24-x64_edb8f26452e645838dc6797fa23374fb24cfd2df.msu
Get-WindowsPackage -Path .\mount | Where-Object { $_.PackageName -match 'KB2976978' } | ForEach-Object {
	Remove-WindowsPackage -Path .\mount -PackageName $_.PackageName
}

とすることでこっちでも削除できたゾ。