使用Process.Start()启动时安装程序失败,但双击时可以正常工作

时间:2011-03-08 19:37:20

标签: c# windows-xp

我遇到了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...
}

更新

我将上面的代码放在一个小型控制台应用程序中,它可以工作。显然,在主应用程序中发生了一些可疑的事情...

原来我忘了关闭一些注册表项。安装程序失败,因为它尝试访问这些相同的密钥。一旦我正确关闭了密钥,代码就可以运行。

对不起伙计们。对我感到羞耻。

2 个答案:

答案 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”?

这将使应用程序/安装程序以管理员身份运行。右键单击图标并告诉它以管理员身份运行

是一回事