2

次のことを達成しようとして困難な問題に遭遇しました: 私のアプリケーションは、サービス (watchdog.exe) と exe ファイル (app.exe) をインストールします。

インストールが完了すると、サービスが開始され、プロセス「app.exe」が作成されます。

アンインストール中にプロセス「app.exe」を強制終了したい(これはローカルシステムアカウントで実行されているため、管理者として実行する必要があります)。

問題 1: インストールでは、CostFinalize フェーズ中にファイル "app.exe" が保持 (実行) されていることがわかるため、再起動が必要であると表示されます (再起動が行われるかどうかを確認するフェーズについて間違っている場合は修正してください)。必要)。アンインストールの開始時にプロセスを強制終了することをお勧めします。アンインストール中にプロセスが実行されていない場合、インストールで再起動が必要であるというメッセージが表示されないことを確認しました。

問題 2: カスタム アクションを使用してプロセスを強制終了することには問題があります。アクションは昇格して実行する必要がありますが、一方で costFinalize の前に実行する必要があります (そうしないと、問題 1 に戻ります)。

提案をいただければ幸いです。また、代替ソリューション (おそらくインストール中に再起動を必要としないプロセスを閉じる別の方法はありますか?)

私が今持っているカスタムアクションコード(不必要に再起動を要求し、権限がないためにプロセスを強制終了できないため、良くありません):

<InstallExecuteSequence>
  <!--<ScheduleReboot After="InstallFinalize" />-->
  <Custom Action="MyProcess.TaskKill" Before="InstallValidate"></Custom>
</InstallExecuteSequence>

<!--<Property Id="Net">Net.exe</Property>-->
<Property Id="QtExecCmdLine" Value='"[%SYSTEMROOT]\System32\taskkill.exe" /F /IM App.exe' />
<CustomAction Id="MyProcess.TaskKill"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="ignore" />

失敗のログは次のとおりです。

CAQuietExec: エラー 0x80070001: コマンド ラインがエラーを返しました。CAQuietExec: エラー 0x80070001: CAQuietExec Failed CustomAction MyProcess.TaskKill が実際のエラー コード 1603 を返しました (変換がサンドボックス内で発生した場合、これは 100% 正確ではない可能性があることに注意してください) アクションは 18:15:54 で終了しました: MyProcess.TaskKill. 戻り値 1603。

4

1 に答える 1

1

私が持っているアイデアはほとんどありません。

  • プロセスが相互に通信できるようにする EventWaitHandles を使用し、希望を app.exe に委任します。その後、必要に応じて app.exe を終了できます。これはクリーンなソリューションであり、優先する必要があります。

なんらかの理由で、世界の何も気にしないようにアプリケーションを強制終了することにした場合は、次のことができます。

基本的に、アプリケーションを強制終了するために実行できるハッカーのトリックはたくさんあります。WiX Burn を使用して管理者権限を要求するなど、自分のことを行います。私は解決策#1に行きます(独自のメカニズムを作成します)

ちなみに、WiX で ServiceControl 要素を使うと、REINSTALLING/UNISTALLING の前にサービスを停止します。Service の OnStop() メソッドにフックして、そこで App.exe を強制終了できます。Service を App.exe の親として設定した場合、子プロセスが親と共に停止するというフラグが表示されます。

于 2013-11-11T19:59:12.177 に答える