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