ら・び・あん・ろ~ず

ちょっと古い IT やらガジェットやらのよもやまごとをつぶやきます。

Windows Installer (MSI) 対応アプリケーションがアンインストールできなくなったときは

Scoop の utau v0.4.19 のマニフェストをデバックしていたところ、うっかりアンインストールできない環境になってしまい、修正に少し手間取ったのでメモがてら書いておきます。

learn.microsoft.com

Windows Installer は、 NSIS (Nullsoft Scriptable Install System)Inno Setup と異なり、Windows に組み込まれたセットアップシステムです。システムに組み込まれているため、いろいろと恩恵があるのですが、余計なお世話、ということもそれなりにあります。そのためトラブルが起きると、通常のインストーラの対処とは異なる対応が必要になります。

アンインストールできない理由と対処

MSI ファイルが存在しない

インストール時に使った MSI ファイルは、C:\Windows\Installer にキャッシュが保管されることがほとんどです。ただ、なんの理由かわからないのですが、キャッシュされない場合があります。その時は、MSI ファイルがインストールと同じ場所にあることを暗黙に想定し、そこに見つからなかった場合は、MSI ファイルの場所を指定するように促すダイアログが表示されます。

この場合、インストール時に使用した MSI ファイルを入手して、指定します。

MSI ファイルは、そのまま提供されていることもありますが、自己展開書庫の形で提供されていることも多くあります。インストーラーが実行形式で、MSI ファイルを利用したインストールを行っているときは、自己展開書庫やダウンローダである可能性があります。7zip などのアーカイバーで展開するなどして、MSI ファイルを入手してください。

また、ここで少しややこしいのは、MSI ファイルには識別子があることです。Windows Installer は、ファイルそのものの違いではなくこの識別子の違いで、同じインストーラかどうかを判別しています。この識別子は、違うインストーラ・違うバージョンの提供であれば、作成者が意識的に変更しないといけないものです。この変更を忘れると大変ややこしいことになります*1。提供者がうっかりしていると、同じ識別子の違うファイルが複数ある場合があります。インストール時に使用したセットアップファイルは、まとめてどこかに取っておくことをお勧めします。

アンインストールするファイルが足りない

誠に遺憾なのですが、MSI によるアンインストールは、アンインストールされるファイルがすべてそろっていないと成功しません。そのため、何らかの事情によりアンインストールが正常終了する前にファイルを削除してしまうと、アンインストールできなくなります。

MSI ファイルを利用したインストールは、修復機能があり、削除されたファイルを MSI ファイルから配置しなおしてくれる機能があります。ただ、インストール過程で作成されるファイルがアンインストールの対象とされていることがあるようで、修復機能ではアンインストール対象のファイルがすべて戻らないことがあります。この修復機能をデバックしているアプリケーションはかなり少ないように感じます*2

確実なのは、ほかの PC で同じソフトウェアをセットアップして、そのフォルダを丸ごとコピーすることです。ソフトウェアが、MSI インストーラ以外のインストール手段を用意している場合、それを利用してファイルがそろうのを祈るという手段も利用できます。Utau v0.4.19 の場合は、圧縮ファイルが別途用意されており、それで難を逃れました。

最終手段として、lessmsi を利用して、MSI ファイルを展開することもできます。

アンインストールスクリプトが失敗している

インストールやアンインストールのタイミングでは、実行ファイルやスクリプトを実行できます。このスクリプトがエラーを返してしまうと、プロセスが中断されてしまいます。

ここで問題が起きている場合、エラーの理由は様々になってしまいます。運が良ければ、展開したファイルの中にスクリプトがあるので、それをデバックすることで問題が解決できる可能性があります。

問題解決に使える(かもしれない)ツール

Microsoft Program Install and Uninstall トラブルシューター

support.microsoft.com

こういうおかしなことになったセットアップエントリーは、以前、Microsoft Program Install and Uninstall トラブルシューターで修復できたような記憶もありました。Windows 11 では、トラブルシューターは廃止予定の機能であり、現在、このトラブルシューターに代わる機能は提供されていません。

CCleaner

www.ccleaner.com

単純にエントリーを消すだけなら、以前の CCleaner にそういう機能がありました。ただ、2017年に Malware に感染するなど、システムの根幹を変更する、というツールの特性に対する信頼性の面でいまひとつの選択肢になってしまいました。

www.kaspersky.com

まとめ

Windows Installer は、作るのも面倒なら使うのも面倒な代物です。ほかの選択肢があるならば、積極的にほかの手段を使っていきたいなぁ、と思う次第です*3

*1:Wix Toolset で開発してるときに、何度か頭を抱えたことがあります。

*2:OSS では、修復に限らず、変更もそれなりに怪しい動作をしていることが多く、インストール以外はまともに動かないと思っておいたほうがよいようです。

*3:Utau マニフェストも、時間が取れたら管理者権限を要求する MSI インストーラを利用するのはやめようと思います。脆弱性対応だったので、早めに対応しておこうと思ったのが裏目に出ました。