WSL向けのWindowsポートフォワード設定をスクリプト化する - @ledsun blog にて、WSLポートフォワード設定をするバッチファイルが出来ました。 WiXの練習用にこのバッチファイルのインストーラーを作ってみました。
ソースコードです。
書いていていくつか面白い、あるいは腑に落ちない現象に出会ったので、メモを残します。
アドバタイズされたショートカット
Windowsインストーラーでは「アドバタイズされたショートカット」という仕様が存在します。
「Windows Installer にはアプリケーションを実際にインストールせずに利用可能な状態にするアドバタイズ機能がある。アドバタイズ機能は、あらかじめユーザーによる実行やアプリによるロードなどを行えるようにするインターフェース部分だけを用意しておき、オンデマンドインストールで説明されているように必要になった時に必要なコンポーネントをインストールする仕組みである。」
説明を読んだかんじ、遅延インストールする機能のようです。 この機能と「管理者として実行」に何の関連があるのかわかりませんが、「アドバタイズされたショートカット」これでバッチファイルへのショートカットを作ると、コンテキストメニューに「管理者として実行」が出てきません。
今回のポートフォワード設定は「管理者として実行」したいので、アドバタイズされていないショートカットを作ります。
アドバタイズショートカットではなく、普通のショートカットを作成する - .NET Tips (VB.NET,C#...)
一番簡単な方法は、DISABLEADVTSHORTCUTS Propertyを設定することでしょう。これにより、アドバタイズショートカットが作成されなくなります。
次のように、オプションをつけてインストールすると「アドバタイズされたショートカット」でなくすることができます。
msiexec.exe /i port-forward.msi /lv hoge.log DISABLEADVTSHORTCUTS=1
オプションなしで「アドバタイズされたショートカット」でなくすることもできます。 しかし、なぜかレジストリキーの登録が必要になります。
<Component Id='PortForwardOff' Guid='{7E167F5E-36E4-4130-9464-FB55D895D07F}'> <File Id='OFF' Name='port-forward-off.bat' DiskId='1' Source='port-forward-off.bat' > <Shortcut Id="startmenuoff" Directory="DesktopFolder" Name="WSLポートフォワード設定 OFF" WorkingDirectory='INSTALLDIR' Advertise="yes" /> </File> </Component>
を、次のようにする必要があります。
<Component Id='PortForwardOff' Guid='{7E167F5E-36E4-4130-9464-FB55D895D07F}'> <File Id='OFF' Name='port-forward-off.bat' DiskId='1' Source='port-forward-off.bat' > <Shortcut Id="startmenuoff" Directory="DesktopFolder" Name="WSLポートフォワード設定 OFF" WorkingDirectory='INSTALLDIR' Advertise="no" /> </File> <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' /> </Component>
オプションつけたときは要らなかったクセに・・・・と不思議な気持ちになります。
ちなみにこの設定でビルドすると次のような警告が出ます。
PS C:\Users\led_l\wix-play-ground\port-forward> light.exe .\port-forward.wixobj Windows Installer XML Toolset Linker version 3.11.2.4516 Copyright (c) .NET Foundation and contributors. All rights reserved. C:\Users\led_l\wix-play-ground\port-forward\port-forward.wxs(34) : warning LGHT1076 : ICE57: Component 'PortForwardOff' has both per-user and per-machine data with an HKCU Registry KeyPath.
This looks like a bug in ICE57. Sadly we don't have access to the ICE57 source, so it is difficult to fix directly. There are a couple of options to work around the problem:
と、あるので、気にしなくて良いのかもしれません。
プログラムメニューからはバッチファイルへのリンクを「管理者として実行」できない
上記の設定をして「アドバタイズされていないショートカット」を作っても、プログラムメニューのショートカットからは「管理者として実行」できません。
リンク先がEXEファイルの場合は「アドバタイズされたショートカット」でも「管理者として実行」できます。 今回はバッチファイルへのリンクを作っているので、苦戦しています。
理由はわかりませんが、今回のインストーラーはデスクトップにショートカットを作ることにしました。