我们正在为我们的软件开发更新系统。更新程序应作为服务在后台运行,并且当有可用更新时,请下载并安装它。我们需要该服务来安装更新,因为MSI需要提升才能运行,但我们的一些客户将是受限用户。
MSI是WiX MSI,并在运行时进行重大升级。问题是,从我们的服务运行时,更新似乎不起作用。我可以看到msiexec运行,并且它成功返回,但它似乎没有对系统进行任何更改。从我的用户帐户运行时,相同的命令按预期工作。
从本地系统服务运行msiexec是否有一些警告?
我们只是在做:
string arguments = "/i /quiet /lv*x " + pathToLogFile;
System.Diagnostics.Process.Start("msiexec.exe", arguments);
答案 0 :(得分:5)
如果您的服务是Windows服务,请执行以下步骤:
在服务控制台中打开服务的属性。
转到登录标签
设置一个有权更新系统的帐户(您的帐户或专门为此目的创建)
重启服务
在这种情况下,服务将以适当的权限运行并可以进行更新。
答案 1 :(得分:3)
如果有其他人碰到这个,这就是我找到的。
我正在从作为LocalSystem运行的服务安装程序。安装将立即返回退出代码0.但是,似乎没有安装该程序。文件未复制到位,并且未创建任何快捷方式。查看日志文件很困难,因为它没有简单的成功或失败消息。当我以普通管理员帐户运行服务时,它运行正常。我终于在日志文件中注意到它说了
确定现有产品 (本产品或产品 正在升级补丁)是 每台机器安装。
未在控制面板中列出>程序,但出于某种原因Windows认为它已经安装。不幸的是,运行msiexec /x
卸载程序也没有任何效果。
我尝试更改产品代码和升级代码,而中提琴,它的工作原理。就我而言,我控制了安装产品代码和升级代码,所以我可以这样做。如果在其他人的情况下,你没有这样的访问权限,你可能会尝试安装一些其他任意软件(它将有不同的产品/升级代码),看看是否有效,如果有,至少你知道那就是问题。
答案 2 :(得分:1)
我也有上述相同的任务,我发现如果为所有用户安装了程序,运行msiexec将在SYSTEM帐户下运行Service。 因此,要使其工作,您必须为所有用户安装。在我的例子中,我在首次安装程序时指定了msxexec命令,如下所示。
msiexec /i setup.msi ALLUSERS="1"
完成此操作后,您可以毫无问题地从服务升级程序。
答案 3 :(得分:1)
您可能需要使用允许您控制升级的REINSTALLMODE
参数。如果没有提供,安装可能会无声升级您的应用程序(或者至少是我发现的那个,尽管我仍然不确定在System.Diagnostics.Process.Start下是否适用相同的行为): / p>
msiexec.exe /i /quiet yourinstaller.msi REINSTALL=All REINSTALLMODE=vomus
有关可以传递给msiexec.exe
的各种标记的详细信息,请参阅here。