msi/WiX で元々用意されている機能以外のことを実行したい場合、「カスタムアクション」を駆使する。
かなり自由度は高いが、管理者権限で操作したい場合はいろいろな制限がある(Vista以降)。
→ WiX 記事一覧
カスタムアクション
本記事では DLL によるカスタムアクションのみを扱っている。
- C++ で カスタムアクション DLL を書くには、msi の API をいろいろ叩く必要がある。
- が、かなり原始的な API なので、生で使うのは結構大変。プロパティの値を取得するだけでも10行ちょっと必要だったり……
- WiX には wcautil (WiX Custom Action Utilities かな?) という msi API をラップしてくれているライブラリがある。独自のインストールログを出力する機能が用意されていたりとかなり便利なのだが、残念ながらドキュメントがまだ無い。ヘッダファイルにも特に説明はないので、ソースを読むしか……。
- でもソースを読んででも、生 msi API を叩くよりはまし*1なので、wix のソースは必須。ま、WixUIExtension の各国語リソース(日本語含む)がソースにしか入っていないので、どっちにしても必要やねんけどね。
管理者権限でカスタムアクションを実行する(UAC、セキュリティ関連)
Windows Vista からは UAC (User Account Control) が導入され、セキュリティ的な制限が色々加わった。
- カスタムアクションを管理者権限で動作させる(権限昇格)には、CustomAction Element に Execute="deferred" と Impersonate="no" を指定する必要がある。
- Execute="deferred" を指定されたカスタムアクションと、限られたプロパティしか受け取れないという制限がある ( http://msdn.microsoft.com/en-us/library/aa370543 必読 )。そこで、deferred で実行されるカスタムアクションより前に、カスタムアクション名と同じ名前のプロパティに渡したい値を設定する必要がある(そのカスタムアクションが実行されるときに、同名のプロパティの値が CustomActionData プロパティに設定されて呼び出される)。
- 任意のプロパティに値を設定するには Custom Action Type 51 を使う、ってリファレンスで当たり前のように番号で語るのはやめて欲しい。さすがにもう慣れたけど(苦笑)。
- まとめると、
- 「deferred custom action に渡すプロパティは、カスタムアクション名のプロパティに値を設定しておき、CustomActionData プロパティで受け取る」
- 「プロパティへの値の設定はCustom Action Type 51 を使う。プロパティへのアクセスが必要なので、もちろん immediate 実行」
<CustomAction Id="SetCustomActionData" Return="check" Property="値を渡したいdeferredなカスタムアクション名" Value="[渡したいプロパティ名],[渡したいプロパティ名],……" /> : <Custom Action="SetCustomActionData" Before="値を渡したいdeferredなカスタムアクション名"></Custom>
- UI や msiexec の起動オプションから渡されたプロパティ ( public property ) はそのままではカスタムアクションからアクセスすることは出来ないので、プロパティの定義に Secure="yes" を付けるか、SecureCustomProperties プロパティに対象となるプロパティ名を明示する。
インストール時にファイアウォールに穴を開けたい
- インストールしたサービスを他のマシンからアクセスできるようにするため、Windows ファイアウォールに例外ポート(もしくは例外プログラム)を追加したいという場合は WiXFirewallExtension を使う ( http://wix.sourceforge.net/manual-wix3/firewall_xsd_index.htm )。
- 簡単に使えて、アンインストール時にはちゃんと設定を消してくれるので便利!
- ただ例によって、WiX のコンポーネント(インストール対象のリソース単位)はディレクトリに属していることが必須なので、「例外ポートの設定」というディレクトリ何も関係ない! 場合でもなにがしかのディレクトリの下に置かないといけない( User Element なども同様)。
→ WiX 記事一覧