我有一项任务是开发一个更新代理,在下载后启动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
}
}
}
答案 0 :(得分:0)
最可能的原因是安装需要提升,所以这会影响一些事情,但这里有一些猜测,因为你的"但它没有工作"并不是非常具体。
在UI模式下运行时,它可能会要求提升。管理员只会获得提升提示,将要求有限用户输入管理员凭据。无论哪种方式,它都会升高。当您以静默方式运行它时,不会显示提升提示(静默意味着静默),因此它也会以静默方式失败,因为它需要提升权限。
您的代码几乎肯定默认为ProcessStartInfo.UseShellExecute = true,因此该进程的任何凭据都不会用于启动MSI。在MSI需要提升并且您希望以静默方式安装它的情况下,您必须为您的exe提供一个提升清单(因此它会提示)或以其他方式提升。您还需要UseShellExecute为false,以便启动是CreateProcess类型的启动,其中进程权限将继承到您启动的进程中。此外,还没有真正需要发布任何东西并陷入此类问题。如果你的进程被提升,那么只需调用MsiInstallProduct,将路径传递给MSI和命令行。然后,您知道安装以您的权限运行。
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