2016-03-23 10 views
0

私はこの問題を数日間は取り組んでいますが、「良い」解決策を見つけることができません。WiX .NETカスタムアクションメソッドの即時カスタムアクションを昇格することは可能ですか?

タスクは、 'netsh advfirewall firewall add ...'への呼び出しをラップするPowerShellスクリプトを実行しています。明らかに、これには昇格された権限が必要です。また、このPowerShellスクリプトでは、成功または失敗のために異なる終了コードが設定されています。遅延WiXカスタムアクションを定義するとすべて正常です。成功した場合、ファイアウォール変更の成功に関するダイアログが表示され、失敗した場合はインストールがロールバックされます。しかし、私たちの顧客は、インストーラを持っているのが好き:

するためには、「PowerShellスクリプトが失敗した場合、MSIインストールのロールバックをさせますが、インストールの最後にUIダイアログ上のいくつかの素晴らしい警告メッセージを表示しない」

別の終了コードを折り返し、.NETカスタムアクションを追加してPowershellスクリプトをC#メソッドで呼び出し、CustomActionDataプロパティとしてMSIインストーラに戻してみました。残念ながら、私はこれを達成できませんでした。遅延アクションがMSIデータベースとやりとりすることができないと考えています。このポストstackoverflow questionを参照してください。

.NETカスタムアクションの終了コードを返すために、「即時」アクションがプロパティを設定すると思います。私はデフォルトで「即時」のアクションは昇格できないことを知っていましたが、.NETカスタムアクションメソッドではPowershell ScriptをC#メソッドの管理者として強制的に実行できますか?

一般に、私たちの目標を達成するための他の方法はありませんか?ちょうど要約:

  1. 昇格された権限でPowerShellを実行します。
  2. Powershellスクリプトが失敗した場合は、インストールをロールバックしないでください。代わりに、別のPowershellスクリプト終了コードで異なるUIを表示してください。

いずれの回答もありがとうございます。ありがとうございました。

+1

あなたがActionResult.Successを返すと、インストールをロールバックできません。 (両方の句で)try catchを実行しようとします。失敗するとcatchに戻り、successを返します。evelated特権として、ユーザに管理者として実行するように頼むことができます –

+0

@FromStuckToFlow、ありがとうあなたの返事のために。 C#カスタムアクションメソッドでは、WiX側の 'immediate'定義で制御されませんか? UACウィンドウを表示することで、壮大な管理者にいつでも頼むことができますか? – Chloe

+0

これは、InstallExecuteSqeuenceと設定方法に応じて実行されます。管理者として実行するように依頼するBefore = "InstallInitialize" –

答えて

0

まずは、私の質問にお答えいただき、ありがとうございます。すべての提案は有望ですが、私は間違いなくすぐに試してみます。現時点では厳密に言えば、私がここに入力しているのはではなく、ですが、ただの回避策です。

常に返すActionResult.Successはロールバックを回避するのに十分な方法です。昇格された権限で実行するために、.NETカスタムアクションは「遅延」アクションとして実行されます。 .NETのカスタムアクション関数の中で、Powershellスクリプトが呼び出され、その終了コードがスクリプトの戻り値として取得されます。 MessageBox.Show()は、さまざまな終了コードに基づいて、.NETカスタムアクションメソッドでPowershellスクリプトの実行状態をユーザーに表示するために使用されます。これはモーダルダイアログボックスであり、インストールプロセスが続行される前にユーザーに通知します。

1

おそらく、代わりに独自のコードを使用して、ファイアウォールのための組み込み機能を使用します。彼らができるようにシステムを変更し

http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html

Using the firewall extension in WiX

とカスタムアクションが常に延期しなければなりませんロールバックして元に戻すことができます。

ロールバックについての選択肢はありません。インストールが失敗した場合、それはロールバックされます!即時カスタムアクションは、インストール全体が管理者権限で管理されている場合にのみ昇格されます。繰り返しますが、これは即時のCAがシステムを変更する予定がなく、したがって高度を必要としないためです。

ロールバックは遅延CAと緩やかに関連しています。ロールバックはインストールが失敗した場合に実行され、ロールバックCAはCAがすでに行ったことを元に戻す方法です。遅延インストールされたCAがロールバックを同等に持つことが必要なのは、インストールの失敗とロールバックの可能性です。 CAは、インストールに失敗するほど重大なエラーが発生すると判断した場合、ロールバックを引き起こす可能性がありますが、ロールバックはWindowsがやることです。 MSIインストールはトランザクションであり、目的はすべて動作するかすべてが失敗し、インストールではシステムを元の状態に戻すためにロールバックスクリプトを保存して(ファイルを保存する)ということです。誰も本当に部分的にインストールされた製品を望んでいます。したがって、直接のCAでファイアウォールの設定を変更した場合、インストールの運命にかかわらず、永続的になります。また、ファイアウォール設定を変更するコードでは、失敗した以前のインストールからの変更が既に存在する可能性があることを考慮する必要があります。このコードは、延期され、ロールバックCAを持たない場合にも、この状況に対処する必要があります。

お客様は、インストールをロールバックしたくないと言った場合、COMを必要としているが参照カウントは必要ないと言うことに相当します。これらはアーキテクチャと設計に組み込まれています。

+0

あなたの答えに感謝します。より柔軟性を得るために、独自のPowerShellスクリプトを用意したいと思っています。また、インストールをロールバックしたくない場合もあります。すべて同じようにありがとう。 – Chloe

+0

1.選択肢がありません!インストールが失敗した場合、それはロールバックされます! 2.即時カスタムアクションは、インストール全体が管理者として昇格され、実行される場合にのみ昇格します。繰り返しますが、これは即時のCAがシステムを変更する予定がなく、したがって高度を必要としないためです。 – PhilDW

+0

システム設定を変更するので、失敗した遅延CAをロールバックする設計目的を理解しています。しかし、私たちの顧客はインストールを元に戻すことを望んでいません。遅延CAが失敗したためにロールバックしないという潜在的なリスクを詳述することができれば、お客様に心を変えてもらうことになります。前もって感謝します。 – Chloe

関連する問題