0

こんにちは、次の 2 つのバイナリ ファイルがあります。

<Binary Id="Sentinel" SourceFile="sentinel_setup.exe"/>
<Binary Id="Hasp" SourceFile="HASPUserSetup.exe"/>

そして、次のようにボタンクリックでそれらを開始したいと思います:

<CustomAction Id="LaunchHasp" BinaryKey="Hasp" ExeCommand="" Return="asyncWait" />
<CustomAction Id="LaunchSentinel" BinaryKey="Sentinel" ExeCommand="" Return="asyncWait"/>

<Publish Event="DoAction" Value="LaunchHasp">1</Publish>

しかし、それは機能しません。昇格された特権でコマンドラインからインストーラーを実行した場合にのみ機能します。私は何を間違っていますか?ありがとう

または、c ++カスタムアクションを使用してバイナリテーブルからファイルを抽出する方法を誰かに教えてもらえますか..:(

4

1 に答える 1

3

即時カスタム アクションには昇格された特権はありません。このようなニーズには、遅延カスタム アクションを使用する必要があります。destimation 環境に変更を加えるアクションは延期する必要があります。詳細については、次の記事を参照してください: http://bonemanblog.blogspot.com/2005/10/custom-action-tutorial-part-i-custom.html

<CustomAction Id="LaunchHasp" Impersonate="no" Execute="deferred" BinaryKey="Hasp" ExeCommand="" Return="asyncWait" />

定義されたカスタム アクションは、ボタンのクリック時ではなく、インストール フェーズ中に実行されます。インストーラーのロジックを修正します。私が理解しているように、exeファイル「sentinel_setup.exe」はシステムを変更するため、InstallExecuteSequenceのInstallInitializeイベントとInstallFinalizeイベントの間にスケジュールする必要があります

チェックボックスを追加して、ユーザーが「Hasp」(またはユーザーが機能ツリーで選択する必要があるインストーラー機能) をインストールするようにマークする必要があることをお勧めします。そして、このチェックボックスの状態に条件付きの定義済みカスタム アクションを追加します。

インストーラーの UI シーケンス中またはその前に、管理アクションを起動することが本当に必要な場合があります。この場合、許可の昇格を要求し、MSI プロセスを実行する前に必要なアクションを実行するセットアップ ブートストラップを作成する必要があります。アクセス許可を求めるには、アプリケーション マニフェストをブートストラップ プロジェクトに追加する必要があります。私のブートストラッパーは非常に単純ですが、多くの場合に機能します。アイコン、アプリケーション マニフェスト、および小さなコード ファイルのみを含む Windows アプリケーションです (Windows フォームはありませんが、コンソール ウィンドウを非表示にすることができます)。

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SetupBootstrapper
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var currentDir = AppDomain.CurrentDomain.BaseDirectory;
            var parameters = string.Empty;
            if (args.Length > 0)
            {
                var sb = new StringBuilder();
                foreach (var arg in args)
                {
                    if (arg != "/i" && arg != "/x" && arg != "/u")
                    {
                        sb.Append(" ");
                        sb.Append(arg);
                    }
                }
                parameters = sb.ToString();
            }

            bool isUninstall = args.Contains("/x") || args.Contains("/u");

            string msiPath = Path.Combine(currentDir, "MyMsiName.msi");

            if(!File.Exists(msiPath))
            {
                MessageBox.Show(string.Format("File '{0}' doesn't exist", msiPath), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            string installerParameters = (isUninstall ? "/x" : "/i ") + "\"" + msiPath + "\"" + parameters;

            var installerProcess = new Process { StartInfo = new ProcessStartInfo("msiexec", installerParameters) { Verb = "runas" } };

            installerProcess.Start();
            installerProcess.WaitForExit();
        }
    }
}
于 2012-11-21T15:28:31.870 に答える