@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

WiXでWSLポートフォワード設定するインストーラーを作る

WSL向けのWindowsポートフォワード設定をスクリプト化する - @ledsun blog にて、WSLポートフォワード設定をするバッチファイルが出来ました。 WiXの練習用にこのバッチファイルのインストーラーを作ってみました。

ソースコードです。

gist.github.com

書いていていくつか面白い、あるいは腑に落ちない現象に出会ったので、メモを残します。

アドバタイズされたショートカット

Windowsインストーラーでは「アドバタイズされたショートカット」という仕様が存在します。

[msi]アドバタイズ機能

Windows Installer にはアプリケーションを実際にインストールせずに利用可能な状態にするアドバタイズ機能がある。アドバタイズ機能は、あらかじめユーザーによる実行やアプリによるロードなどを行えるようにするインターフェース部分だけを用意しておき、オンデマンドインストールで説明されているように必要になった時に必要なコンポーネントをインストールする仕組みである。」

説明を読んだかんじ、遅延インストールする機能のようです。 この機能と「管理者として実行」に何の関連があるのかわかりませんが、「アドバタイズされたショートカット」これでバッチファイルへのショートカットを作ると、コンテキストメニューに「管理者として実行」が出てきません。

f:id:ledsun:20211124101539p:plain
コンテキストメニューに「管理社として実行」が表示されない

今回のポートフォワード設定は「管理者として実行」したいので、アドバタイズされていないショートカットを作ります。

アドバタイズショートカットではなく、普通のショートカットを作成する - .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.

wix - error LGHT0204 : ICE57: Component 'XXX' has both per-user data and a keypath that can be either per-user or per-machine - Stack Overflow

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:

と、あるので、気にしなくて良いのかもしれません。

プログラムメニューからはバッチファイルへのリンクを「管理者として実行」できない

上記の設定をして「アドバタイズされていないショートカット」を作っても、プログラムメニューのショートカットからは「管理者として実行」できません。

f:id:ledsun:20211124102616p:plain
プログラムメニューでは「管理者として実行」できない

リンク先がEXEファイルの場合は「アドバタイズされたショートカット」でも「管理者として実行」できます。 今回はバッチファイルへのリンクを作っているので、苦戦しています。

理由はわかりませんが、今回のインストーラーはデスクトップにショートカットを作ることにしました。

参考