我遇到了System.Diagnostics.Process.Start()
的问题。
当我启动第三方安装程序(包装在可执行文件中的MSI包)时,通过双击exe或从命令行调用它来启动它时会毫无问题地安装。
但是,当我使用Process.Start()
从应用程序中启动它时,安装程序失败,错误代码为5 =访问被拒绝。日志说它失败了,因为它无法恢复某些注册表设置。
有没有人知道双击exe和从应用程序中启动进程之间的区别(安全性)?用户以管理员身份运行。
示例代码:
var info = new ProcessStartInfo();
info.FileName = @"C:\MyFolder\setup.exe";
info.UseShellExecute = false; // I have tried both true and false here
Process p = Process.Start(info);
p.WaitForExit();
if (p.ExitCode != 0)
{
// Do something...
}
更新
我将上面的代码放在一个小型控制台应用程序中,它可以工作。显然,在主应用程序中发生了一些可疑的事情...
原来我忘了关闭一些注册表项。安装程序失败,因为它尝试访问这些相同的密钥。一旦我正确关闭了密钥,代码就可以运行。
对不起伙计们。对我感到羞耻。
答案 0 :(得分:0)
所以这可能不会像你期望的那样发挥作用;我假设你要去无人值守安装。尝试这样的事情:
Process installer = new Process()
installer.StartInfo.FileName = @"C:\MyFolder\Setup.exe";
installer.StartInfo.Arguments = " /s /v\" /qn\"";
installer.Start()
installer.WaitForExit();
if ( installer.ExitCode != 0 )
{
//do something
}
该参数告诉安装程序exe以静默方式运行(/ s)并将参数传递给MSI(/ v)。 / qn是静默运行安装程序的Windows Installer参数,应该不需要用户交互,并且应该允许安装程序正常运行。
答案 1 :(得分:0)
您是否尝试过设置info.Verb =“runas”?
这将使应用程序/安装程序以管理员身份运行。右键单击图标并告诉它以管理员身份运行
是一回事