[Step by Step Guide] MSI 詳細ログからエラーの原因を特定する例

Visual Studio サポート チームのオオカワです。

この記事では、「MSI ファイルをインストール時にエラーが発生する場合のログ採取方法」の記事で取り上げたシナリオで MSI 詳細ログを取得したとして、解析はどのように行ったらよいかを流れを追ってご説明いたします。まずはシナリオのおさらいから。

[シナリオ]

Visual Studio 2005 でインストーラーを作成した。このインストーラーではカスタム動作を使っている。Windows XP まででは正常にインストールできていたのだが、Windows Vista 以降、インストールに失敗している。この原因を追究したい。

それでは、秘伝の(?)トラブルシュート、ご覧ください!


[手順]

1. ログを開き、「戻り値 3」を探す

MSI 詳細ログにおいて、致命的なエラーが発生した場合には、ログに「戻り値 3」が残ります。

まずはこの値をログから探していきましょう。

MSI (s) (34:30) [05:30:37:135]: Leaked MSIHANDLE (12) of type 790531 for thread 7552 MSI (s) (34:30) [05:30:37:151]: Note: 1: 2769 2: _E63CD636_00E8_493B_86CE_F277981FD258.install 3: 1
MSI (s) (34:30) [05:30:37:151]: Note: 1: 2262 2: Error 3: -2147287038
DEBUG: Error 2769: Custom Action _E63CD636_00E8_493B_86CE_F277981FD258.install did not close 1 MSIHANDLEs.
このパッケージをインストールするときに予期しないエラーが検出されました。このパッケージは問題がある可能性があります。エラー コードは 2769 です。 引数: _E63CD636_00E8_493B_86CE_F277981FD258.install, 1,
CustomAction _E63CD636_00E8_493B_86CE_F277981FD258.install returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
操作終了 5:30:37: InstallFinalize。 戻り値 3。

 

2. カスタム動作の MSIHANDLE のリークが原因のようなので、その部分を探す

1. で見つけたエラーログの前後関係を追ってみると、以下の一行が怪しいですね。

DEBUG: Error 2769: Custom Action _E63CD636_00E8_493B_86CE_F277981FD258.install did not close 1 MSIHANDLEs.

この行に書いてあるカスタム動作名 "E63CD636_00E8_493B_86CE_F277981FD258.install" の実行時のログを、MSI 詳細ログファイルの中から探してみましょう。

MSI (s) (34:CC) [05:29:34:372]: Executing op: ActionStart(Name=_E63CD636_00E8_493B_86CE_F277981FD258.install,,)
操作 5:29:34: _E63CD636_00E8_493B_86CE_F277981FD258.install。
MSI (s) (34:CC) [05:29:34:372]: Executing op: CustomActionSchedule(Action=_E63CD636_00E8_493B_86CE_F277981FD258.install,ActionType=1025,Source=BinaryData,Target=ManagedInstall,CustomActionData=/installtype=notransaction /action=install /LogFile= "C:\Program Files (x86)\Microsoft\20110526_installer\MSICustomAction.dll" "C:\Users\test\AppData\Local\Temp\CFGDBEF.tmp")
MSI (s) (34:30) [05:29:34:403]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIECF4.tmp, Entrypoint: ManagedInstall
MSI (s) (34!80) [05:29:37:383]: Note: 1: 2262 2: Error 3: -2147287038
MSI (c) (40:B0) [05:29:37:383]: Note: 1: 2262 2: Error 3: -2147287038
DEBUG: Error 2869: The dialog ErrorDialog has the error style bit set, but is not an error dialog
MSI (c) (40:B0) [05:29:37:445]: Font created. Charset: Req=128, Ret=128, Font: Req=MS Pゴシック, Ret=MS Pゴシック
このパッケージをインストールするときに予期しないエラーが検出されました。このパッケージは問題がある可能性があります。エラー コードは 2869 です。 引数: ErrorDialog, ,
MSI (c) (40:B0) [05:30:37:119]: Note: 1: 2262 2: Error 3: -2147287038
MSI (c) (40:B0) [05:30:37:119]: 製品: 20110526_installer -- このパッケージをインストールするときに予期しないエラーが検出されました。このパッケージは問題がある可能性があります。エラー コードは 2869 です。 引数: ErrorDialog, ,エラー 1001。

やはり、エラーになっていたのはここでした。エラーコードは 2869 のようです。

3. 根本原因追究

自分が追加したカスタム動作 DLL の実行でエラーになっているようだ、という点までエラーメッセージからわかりました。

ここから、事例を調査していきます。こんな感じのクエリを、弊社 Bing に投げまして…。

https://www.bing.com/search?q=msi+2869+custom+action

そうすると、こんな Microsoft Connect の記事を見つけました。

Error 2869 installing MSI with Custom Action on Vista (MSI created using VS 2005 Deployment Project)
https://connect.microsoft.com/VisualStudio/feedback/details/216784/error-2869-installing-msi-with-custom-action-on-vista-msi-created-using-vs-2005-deployment-project

それによると、"NoImpersonate" という属性をカスタム動作につけなければいけないようです。

そのためには以下の 2 つの方法があるようですね…。

  • Visual Studio 2008 以降のバージョンを使う
  • ポスト ビルド イベントをカスタマイズして、MSI ファイル中のカスタム動作に NoImpersonate プロパティを設定する

ポスト ビルド イベントのスクリプトは、"NoImpersonate.js" として以前は公開されていたようですが、すでに Connect からは削除されてしまっていました…。というわけで、Bing の旅もう一度、ですね。

https://www.bing.com/search?q=NoImpersonate.js

すると Microsoft に関連するドメインである、"msdn.com" 配下にこんな記事を見つけました。

Script to set NoImpersonate bit for custom actions in Visual Studio 2005 setup projects
https://blogs.msdn.com/b/astebner/archive/2007/05/28/2958062.aspx

ここにエラーに対処するための Java Script のファイルと、その組み込み方があったので、Visual Studio 2005 のセットアッププロジェクトに組み込んで、再度 MSI ファイルをビルドします。

4. 現象解決

すると、無事にインストールが完了するようになりました!やはり、NoImpersonate プロパティが設定されていないことが原因だったようです。


[補足 : なぜ NoImpersonate プロパティを設定しなければいけなかったか?]

このフラグは、MSI ファイルに含まれるカスタム動作をどのユーザー権限で実行するかを指定するものです。この値が設定されていない場合、カスタム動作は、MSI ファイルをインストールしようとしているユーザーの権限で動作します。この値が設定されている場合、カスタム動作は、windows installer エンジンの実行ユーザーである、システム権限で動作します。

上記を踏まえ、Windows Vista 以降に導入された UAC の動作を考慮すると、以下のような構図が浮かび上がってきます。

  1. システム権限で msiexec が起動され、UAC による昇格が発生する
  2. カスタム動作の実行時に、UAC で昇格していない、インストーラーの起動ユーザーで実行される
  3. 権限不足の為作業が継続できない
  4. エラー発生

これらは、UAC の存在しなかった世代の開発ツールである Visual Studio 2005 で作ったインストーラー固有の現象です。

Windows Vista に公式に対応している Visual Studio 2008 以降では、既定で NoImpersonate プロパティが有効化されているのでご安心ください!


さて、MSI 詳細ログからのトラブルシュートの例をご案内いたしましたが、いかがでしたでしょうか?Windows Installer によるインストール時のほかのエラーに関しても、だいたい似たような感じで大まかな原因箇所の特定は可能な場合も多いです。

是非、お困りごとの解決に有効利用いただければ幸いです。

==== Visual Studio サポート チーム オオカワ ====