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

Posted

技术标签:

【中文标题】安装程序在使用 Process.Start() 启动时失败,但在双击时工作【英文标题】:Installer fails when launched using Process.Start() but works when double-clicked 【发布时间】:2011-07-11 09:02:19 【问题描述】:

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

更新:

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

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

对不起各位。真丢人。

【问题讨论】:

@Kipotlov - 问题被标记为 windows-xp。 如果正常执行需要用户交互以允许某些操作,您可能必须通过安装程序将命令行参数向下传递到 MSI。您如何设置此 Process 对象并调用它的示例可能会有所帮助。 【参考方案1】:

因此,无论如何,这可能不会像您期望的那样起作用;我假设您要进行无人值守的安装。试试这样的:

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 参数,它不需要用户交互并且应该允许安装程序正常运行。

【讨论】:

【参考方案2】:

您是否尝试设置 info.Verb = "runas"?

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

【讨论】:

以上是关于安装程序在使用 Process.Start() 启动时失败,但在双击时工作的主要内容,如果未能解决你的问题,请参考以下文章

C# Process.Start 路径

在windowService用Process.Start()启动程序没有界面-记录

使用 process.start 后如何退出主程序?

使用 Process.Start() 通过快捷方式运行应用程序

在wpf中使用Process.Start()启动了一个程序,要怎样才能等待这个程序执行完并输出结果后再执行后面的语句

如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?