从代码以静默方式启动MSI安装程序

时间:2017-02-16 08:17:02

标签: c# windows-installer silent-installer

我有一项任务是开发一个更新代理,在下载后启动msi文件,安装必须对用户不可见。

但我在没有UI的情况下启动它有问题。我尝试使用/q/qn,但它不起作用,它只适用于UI选项。

internal static class MSI_runner
{
    public static bool RunInstallMSI(string sMSIPath)
    {
        try
        {
            Console.WriteLine("begin");
            //Starting to install application
            Process process = new Process();
            process.StartInfo.FileName = "msiexec.exe";
            process.StartInfo.Arguments = string.Format(" /q  /i \"{0}\" REINSTALLMODE=amus ", sMSIPath);
            Console.WriteLine("start");

            process.Start();
            process.WaitForExit();
            Console.WriteLine("end");

            return true;
        }
        catch
        {
            // "There was a problem installing the application!
            return false;  //Return False if process ended unsuccessfully
        }
    }
}

2 个答案:

答案 0 :(得分:0)

最可能的原因是安装需要提升,所以这会影响一些事情,但这里有一些猜测,因为你的"但它没有工作"并不是非常具体。

  1. 在UI模式下运行时,它可能会要求提升。管理员只会获得提升提示,将要求有限用户输入管理员凭据。无论哪种方式,它都会升高。当您以静默方式运行它时,不会显示提升提示(静默意味着静默),因此它也会以静默方式失败,因为它需要提升权限。

  2. 您的代码几乎肯定默认为ProcessStartInfo.UseShellExecute = true,因此该进程的任何凭据都不会用于启动MSI。在MSI需要提升并且您希望以静默方式安装它的情况下,您必须为您的exe提供一个提升清单(因此它会提示)或以其他方式提升。您还需要UseShellExecute为false,以便启动是CreateProcess类型的启动,其中进程权限将继承到您启动的进程中。此外,还没有真正需要发布任何东西并陷入此类问题。如果你的进程被提升,那么只需调用MsiInstallProduct,将路径传递给MSI和命令行。然后,您知道安装以您的权限运行。

  3. https://msdn.microsoft.com/en-us/library/windows/desktop/aa370315(v=vs.85).aspx

    假设您的代码正在运行,而且除此之外,您还不清楚您期望的升级类型。没有提到您的MSI是否有新的ProductCode,ProductVersion等。通过重新安装带有REINSTALLMODE的新MSI来应用小更新的常规方法是:

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa367575(v=vs.85).aspx

    和REINSTALLMODE应该是vomus。

答案 1 :(得分:-1)

尝试cactch(Exception ex)并查看ex.message是什么。 点击这里查看msiexec params: http://www.advancedinstaller.com/user-guide/msiexec.html