Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Windows Installer & InstallShield はまり道

  • 「InstallShield公認ガイドブック」 (ASIN:475614425X) は必須! もしくは英語の勉強をすること。
  • 遅延実行されるカスタムアクションでは、殆んどのプロパティの読み出しが行えない。*1 そのようなカスタムアクションでは「カスタムアクションに値を渡すためのカスタムアクション」を別途作成して即時実行し、読み出す側は CustomActionData プロパティから値を読み出す。
  • UIシーケンスから実行シーケンスに渡されるパブリックプロパティは、そのままではカスタムアクションからアクセスできない。カスタムアクションに渡す必要のあるプロパティの名前を SecureCustomProperties プロパティにセミコロンで区切って列挙する必要がある *2 *3
  • 遅延実行シーケンスで実行されるカスタムアクションは、MSI を実行したユーザの権限で実行されるため、Windows Vista では多くの場合実行に失敗する *4。対策としては「遅延実行」の代わりに「システムの設定で遅延実行」(deferred execution in system context) を指定する *5ロールバックについても同様。
  • InstallScript のビルトイン関数 StrGetTokens で先頭にデリミタ文字のある文字列を tokenize すると、戻り値の配列の先頭に2番目の文字列を挿入して返す(先頭の空文字列からなるトークンを無視する)*6。対策としては、順序が自由になるのなら先頭に空文字列が来ないようにトークンを入れ替える。そうでない場合は、文字列の先頭がデリミタであるか判定して処理を分岐する。

*1:http://msdn2.microsoft.com/en-us/library/aa370543.aspx

*2:http://msdn2.microsoft.com/en-us/library/aa371571(VS.85).aspx

*3:カスタムアクションで呼び出される処理にセキュリティホールがあった際に、プロパティから値を読み出されないための仕様と思われる

*4:Windows Vita の UAC 環境下では、管理者権限を持つユーザは常に root として操作を行っているわけではない。必要になった段階で初めてダイアログが表示され、管理者権限が有効になる。自動で sudo が起動するようなもの

*5:これにより http://msdn2.microsoft.com/en-us/library/aa368069(VS.85).aspx の msidbCustomActionTypeNoImpersonate ビットが有効になる。http://sklave.jp/2007/200710230211 も参照

*6:http://helpnet.macrovision.com/robo/projects/devstudio9helplangref/LangrefStrGetTokens.htm