通常WiX Toolset(以降単にWiXとする)で作成したインストーラで、アプリをインストールすると、Windowsの「アプリと機能」では次のように「変更」と「アンインストール」が表示される。
これに対し、旧来のコントロールパネルより利用できる「プログラムと機能」では、アプリを右クリックすると、次のように「アンインストール」、「変更」、「修復」を選択可能なコンテキストメニューが表示される。
この記事では、これらの選択肢のうち「アンインストール」のみを非表示または使用不可にする方法について説明する。
「アンインストール」を非表示/使用不可にする
Windows Installerのプロパティ ARPNOREMOVE に 1 を設定する。
<Property Id="ARPNOREMOVE">1</Property>
すると、「プログラムと機能」のコンテキストメニューでは、「アンインストール」が非表示となる。
しかし「アプリと機能」では、「アンインストール」と同時に「変更」までもが使用不可となってしまう。
「変更」を使用可能にする
「アプリと機能」や「プログラムと機能」の表示には、下記のレジストリキーの内容が反映される。({ProductCode}
は製品毎に付与されたGUID)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}
そこで、 ARPNOREMOVE
を設定する前と後で、上記レジストリキーの内容を比較してみる。なお、このアプリの ProductCode
は、{3E990A3D-1AA9-A2B1-20A0-165054F1A654}
である。
設定後の内容では、NoRemove
の値が追加され、ModifyPath
およびUninstallString
の値が削除されているのが分かる。ModyfyPath
についてはMicrosoftのドキュメントでは、「Determined and set by the Windows Installer.」(訳:Windows Installerにより決定およびセットされる)としか書かれていない。しかし、名前と設定値から推測すると「変更」選択時に実行されるコマンドのようなので、ARPNOREMOVE
の設定前と同じ値MsiExec.exe /I{3E990A3D-1AA9-A2B1-20A0-165054F1A654}
を手動で設定してみると、「変更」のみを使用可能にすることができた。
なお、WiXにてModyfyPath
を設定するコードは、下記のようになる。
<RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]">
<RegistryValue Type="expandable" Name="ModifyPath" Value="MsiExec.exe /I[ProductCode]" />
</RegistryKey>
さらなる問題
ここまでで「アプリと機能」で「アンインストール」ボタンだけを無効にするという目的は達成したが、こんなことをしようと思ったそもそもの動機は、アプリをアンインストールさせたくないわけではなく、必ず「変更」経由でアプリをアンインストールしてもらうためである。そこで、「アプリと機能」で「変更」ボタンをクリックし、セットアップウィザードを進め、下記の画面(メンテナンス種別選択画面と呼ぶ)を表示させる。
「削除」を押してアプリをアンインストールしたいのに、「削除」ボタンが使用不可になっている。これは、WixUI(WiXの標準UIライブラリ)のメンテナンス種別選択画面も、プロパティARPNOREMOVE
の値によって「削除」ボタンの有効/無効を切り変えているためである。「削除」ボタンを有効にするにはWixUIのメンテナンス種別選択画面をカスタマイズする必要があるが、その方法については別の機会に説明したい。
なお、この状態からアプリをアンインストールするには、レジストリキーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}
から値NoRemove
を削除し、コントロールパネルの「プログラムと機能」より「アンインストール」を選択すればよい。