0

嗨,我有这两个二进制文件:

<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

即时自定义操作没有提升的权限。您应该使用延迟自定义操作来满足此类需求。应该推迟对估计环境进行更改的任何操作。有关更多详细信息,请阅读本文: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 回答