2

私の会社が作成したインストーラーで使用されるさまざまな CA を持つカスタム アクション プロジェクトがあります。そのうちのいくつかは、Microsoft.Web.Administration API を介して IIs7 を操作するために使用されます。

IIs 関連の CA を含むクラスに、SetApplicationAutoStart という新しいカスタム アクションを追加しました。このカスタム アクションは、最初の応答時間が短くなるように、II に WCF サービスのプリロードと開始を強制する autoStart 属性を設定するために使用されます。

このアクションを追加した後、SetAppPoolLoadUserProfileTrue という既存の CA が機能しなくなりました。この CA は、コンピューターの既定のサイトが変更されてこの設定が false になっている場合でも、サイトの設定を強制的に true にするため、実際に機能させる必要があります。

アクションが失敗した場合、ログ ファイルには次の行が含まれます。

MSI (s) (A0:18) [15:02:43:639]: Executing op: ActionStart(Name=SetAppPoolLoadUserProfileTrue,,)
Action 15:02:43: SetAppPoolLoadUserProfileTrue. 
MSI (s) (A0:18) [15:02:43:641]: Executing op: CustomActionSchedule(Action=SetAppPoolLoadUserProfileTrue,ActionType=3073,Source=BinaryData,Target=SetAppPoolLoadUserProfileTrue,CustomActionData=AppPoolName=xxxxx)
MSI (s) (A0:18) [15:02:43:670]: Creating MSIHANDLE (377) of type 790536 for thread 50712
MSI (s) (A0:C8) [15:02:43:670]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIBD82.tmp, Entrypoint: SetAppPoolLoadUserProfileTrue
CustomAction SetAppPoolLoadUserProfileTrue returned actual error code 1154 (note this may not be 100% accurate if translation happened inside sandbox)
MSI (s) (A0:C8) [15:02:43:673]: Closing MSIHANDLE (377) of type 790536 for thread 50712
MSI (s) (A0:18) [15:02:43:674]: Note: 1: 1723 2: SetAppPoolLoadUserProfileTrue 3: SetAppPoolLoadUserProfileTrue 4: C:\Windows\Installer\MSIBD82.tmp 
Error 1723. There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor.  Action SetAppPoolLoadUserProfileTrue, entry: SetAppPoolLoadUserProfileTrue, library: C:\Windows\Installer\MSIBD82.tmp 
MSI (s) (A0:18) [15:20:25:139]: Product: xxxxxxx -- Error 1723. There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor.  Action SetAppPoolLoadUserProfileTrue, entry: SetAppPoolLoadUserProfileTrue, library: C:\Windows\Installer\MSIBD82.tmp 
Action ended 15:20:25: InstallFinalize. Return value 3.

これは、このアクションの PE から dotnet PE を抽出する際の問題のようです。バイナリ内の他のすべての CA は、新しい CA を含めて正しく機能します。

4

3 に答える 3

2

私にも同じことが起こりました。「galets」はすでに正しい方向を向いていて、私を軌道に乗せていました(賛成票を投じる担当者はいません、申し訳ありません)。

短縮版:

MakeSfxCA は、観察された動作につながる PE / COFF 仕様に従わないネイティブ dll を生成します。

長いバージョン:

  1. 「HavocEntryPointa」、「HavocEntryPointB」、「HavocZappEntryPoint」という名前の 3 つのエクスポートされたエントリ ポイント (つまり、「CustomAction」属性でマーク) を持つ「HavocAction」などの CA を構築します (正確なスペルに注意してください)。メソッドは「ActionResult.Success」を返すだけかもしれません。
  2. a) 「HavocEntryPointa」のみを呼び出す、b) 「HavocEntryPointB」のみを呼び出す、単純なセットアップを考え出します。
  3. ==> セットアップ "a)" は機能しますが、セットアップ "b)" は失敗します
  4. 「HavocZappEntryPoint」の「CustomAction」属性のコメントを外すと、動作が逆になります。
  5. ==> セットアップ "a)" は失敗しますが、セットアップ "b)" は機能します

さらなる分析

ラップされた CA.dll ファイルをダンプすると、

dumpbin /Export HavocAction.CA.dll

あなたは(抜粋)のようなものを得る

125   7C 00003A36 
126   7D 00003A4C HavocEntryPointa
127   7E 00003A62 HavocEntryPointB
128   7F 00003A78 HavocZappEntryPoint
129   80 000042FC zzzEmbeddedUIHandler
130   81 000043B8 zzzInitializeEmbeddedUI
131   82 0000467F zzzShutdownEmbeddedUI
132   83 00003AA5 zzzzInvokeManagedCustomActionOutOfProcW

これは間違っています (「pecoff_v83.docx」を検索してください。Exported DLL functions not lexically order?を参照してください)。dll からメソッドをロードするときにバイナリ検索を実行するために、エントリは (ASCII で) ソートされるはずです (エントリ "HavocEntryPointa" と "HavocEntryPointB" が交換されます)。

私の推測では、dll からコードをロードすると、バイナリ検索が失敗し、エラーが発生します。二分探索の性質上、「HavocZappEntryPoint」を削除すると結果が逆になります。

OPに関する備考

Kjartan は最初に "SetApplicationAutoStart" と "SetAppPoolLoadUserProfileTrue" を使用しましたが、順序が間違っていたため、CA.dll に正しくエクスポートされませんでした。大文字の「P」は小文字の「l」の前に来ますが、これは MakeSfxCA によって交換されました。後者の選択である「ConfigureApplicationAutoStart」と「SetAppPoolLoadUserProfileTrue」は、PE / COFF 仕様に準拠するように並べられています。

PS: これは現在http://wixtoolset.org/issues/4502です。

アップデート

PPS: WiX 3.9 RC3 リリースから、この問題のバグ修正が含まれています。すべてが期待どおりに機能します。

于 2014-08-14T03:23:39.357 に答える
1

これは実際にはかなり奇妙ですが、長い間答えを探してさまざまなことを試した後、新しい CA の名前を SetApplicationAutoStart から ConfigureApplicationAutoStart に変更しようとしたところ、SetAppPoolLoadUserProfileTrue が再び適切に機能し始めました。

于 2012-08-15T18:01:12.900 に答える