2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【WiX Toolset】「アプリと機能」で「アンインストール」ボタンだけを無効にする

Posted at

通常WiX Toolset(以降単にWiXとする)で作成したインストーラで、アプリをインストールすると、Windowsの「アプリと機能」では次のように「変更」と「アンインストール」が表示される。
apps_normal.png
これに対し、旧来のコントロールパネルより利用できる「プログラムと機能」では、アプリを右クリックすると、次のように「アンインストール」、「変更」、「修復」を選択可能なコンテキストメニューが表示される。
programs_normal.png
この記事では、これらの選択肢のうち「アンインストール」のみを非表示または使用不可にする方法について説明する。

「アンインストール」を非表示/使用不可にする

Windows Installerのプロパティ ARPNOREMOVE1 を設定する。

<Property Id="ARPNOREMOVE">1</Property>

すると、「プログラムと機能」のコンテキストメニューでは、「アンインストール」が非表示となる。
programs_noremove.png
しかし「アプリと機能」では、「アンインストール」と同時に「変更」までもが使用不可となってしまう。
apps_noremove.png

「変更」を使用可能にする

「アプリと機能」や「プログラムと機能」の表示には、下記のレジストリキーの内容が反映される。({ProductCode} は製品毎に付与されたGUID)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}

そこで、 ARPNOREMOVE を設定する前と後で、上記レジストリキーの内容を比較してみる。なお、このアプリの ProductCode は、{3E990A3D-1AA9-A2B1-20A0-165054F1A654}である。

  • ARPNOREMOVE の設定前
    uninstall_reg_normal.png
  • ARPNOREMOVE の設定後
    uninstall_reg_noremove.png

設定後の内容では、NoRemoveの値が追加され、ModifyPathおよびUninstallStringの値が削除されているのが分かる。ModyfyPathについてはMicrosoftのドキュメントでは、「Determined and set by the Windows Installer.」(訳:Windows Installerにより決定およびセットされる)としか書かれていない。しかし、名前と設定値から推測すると「変更」選択時に実行されるコマンドのようなので、ARPNOREMOVEの設定前と同じ値MsiExec.exe /I{3E990A3D-1AA9-A2B1-20A0-165054F1A654}を手動で設定してみると、「変更」のみを使用可能にすることができた。
apps_noremove_modifypath.png
なお、WiXにてModyfyPathを設定するコードは、下記のようになる。

<RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]">
	<RegistryValue Type="expandable" Name="ModifyPath" Value="MsiExec.exe /I[ProductCode]" />
</RegistryKey>

さらなる問題

ここまでで「アプリと機能」で「アンインストール」ボタンだけを無効にするという目的は達成したが、こんなことをしようと思ったそもそもの動機は、アプリをアンインストールさせたくないわけではなく、必ず「変更」経由でアプリをアンインストールしてもらうためである。そこで、「アプリと機能」で「変更」ボタンをクリックし、セットアップウィザードを進め、下記の画面(メンテナンス種別選択画面と呼ぶ)を表示させる。
maintenance_type_noremove.png
「削除」を押してアプリをアンインストールしたいのに、「削除」ボタンが使用不可になっている。これは、WixUI(WiXの標準UIライブラリ)のメンテナンス種別選択画面も、プロパティARPNOREMOVEの値によって「削除」ボタンの有効/無効を切り変えているためである。「削除」ボタンを有効にするにはWixUIのメンテナンス種別選択画面をカスタマイズする必要があるが、その方法については別の機会に説明したい。

なお、この状態からアプリをアンインストールするには、レジストリキーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}から値NoRemoveを削除し、コントロールパネルの「プログラムと機能」より「アンインストール」を選択すればよい。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?