5

以下のコードを使用して、マージモジュール( WiXで作成)のインストール中に実行したいコマンドラインがあります。

<CustomAction
    Id='SetWebsiteProtocols'
    Execute='commit'
    Return='ignore'
    Impersonate="yes"
    FileKey='Web.config'
    ExeCommand='c:\windows\system32\inetsrv\appcmd.exe set app "Default Web Site/My Website" /enabledProtocols:http,net.tcp,net.pipe' />

<InstallExecuteSequence>
    <Custom Action="SetWebsiteProtocols" After="InstallFiles"/>
</InstallExecuteSequence>

コマンドラインでコマンドを実行すると(現時点ではハードコードされています)、正常に機能します。ただし、インストール中に実行すると失敗します。ロギングをオンにするとエラーコード1721が表示されますが、グーグルすると何も返されません。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

11

コードに多くの問題があります。

  1. ポリシーによってロールバックが無効になっている場合は処理されないコミットがスケジュールされています。

  2. 消費しているMSIがUI/実行プロセスを昇格させているによってブートストラップされていない場合、UAC/昇格された状況で失敗する可能性のあるUACになりすましています。setup.exe

  3. system32WINDOWSをWINDOWSと呼ぶ必要がないために存在しないか、OSプラットフォームに応じて32ビットまたは64ビットのシステムフォルダーである可能性があるフォルダーへのパスをハードコーディングしました。

  4. リターンコードを無視しているため、これが失敗した場合でもインストールは続行されます。プラグを差し込んで誰かに祈る?

  5. インストール中に、大きな醜い点滅する黒いコンソールウィンドウが表示され、「ああ、この男は自分が何をしているのかわからなかった」と叫びます。

  6. EXEからログアウトすることは絶対にありません。

  7. EXEカスタムアクションを直接呼び出すと発生する可能性のある問題に気付いていない可能性があります。

これらの懸念を理解するのに役立ついくつかの読み物があります:

ここで、車輪の再発明を行っている可能性があることにも触れておきますが、WiXの組み込みIISカスタムアクションでは、必要なバリエーションポイントが公開されていないようです。残念です。したがって、EXE呼び出しを修正するには、次の機能を確認することをお勧めします。

これは、 DOSボックスを点滅させずにEXEを呼び出し、MSIログに適切にログインし、MicrosoftのEXEに関する多くの懸念事項を修正する非常に洗練された方法だと思います。そこから修正する必要があるので、正しい32ビットまたは64ビットのappcmdを適切に解決できます。私のインストーラーは、64ビットのみのプラットフォームであるServer 2008 R2のみを対象としているため、コードは次のようになります。

(このコードは、InstallShieldが公開しないものを補強します...)

<CustomAction Id="SetIISAuthCAD"
              Property="SetIISAuth"
              Value="&quot;[System64Folder]inetsrv\appcmd.exe&quot; set config &quot;Default Web Site/MyApplication&quot; /section:system.webServer/security/authentication/windowsAuthentication /useAppPoolCredentials:true /commit:MACHINE/WEBROOT/APPHOST " />
<CustomAction Id="SetIISAuth"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec64"
              Execute="deferred"
              Return="ignore"
              Impersonate="no" />
<InstallExecuteSequence>
    <Custom Action="SetIISAuth"
            Before="InstallFinalize">Not Installed</Custom>
    <Custom Action="SetIISAuthCAD"
            Before="SetIISAuth">Not Installed</Custom>
</InstallExecuteSequence>
于 2012-04-05T12:49:40.393 に答える