从服务运行msiexec(本地系统帐户)

我们正在为我们的软件开发更新系统。 更新程序应作为服务在后台运行,并且当有可用更新时,请下载并安装它。 我们需要服务来安装更新,因为MSI需要提升才能运行,但我们的一些客户端将是受限用户。

MSI是WiX MSI,运行时进行重大升级。 问题是,从我们的服务运行时,更新似乎不起作用。 我可以看到msiexec运行,并且它成功返回,但它似乎没有对系统进行任何更改。 从我的用户帐户运行时,相同的命令按预期工作。

从本地系统服务运行msiexec有一些警告吗?

我们只是在做:

string arguments = "/i /quiet /lv*x " + pathToLogFile; System.Diagnostics.Process.Start("msiexec.exe", arguments); 

如果您的服务是Windows服务,请执行以下步骤:

  1. 在服务控制台中打开服务的属性。

  2. 转到“ 登录”选项卡

  3. 设置有权更新系统的帐户(您的帐户或专门为此目的创建)

  4. 重启服务

在这种情况下,服务将以适当的权限运行并可以进行更新。

如果有其他人碰到这个,这就是我找到的。

我正在从作为LocalSystem运行的服务安装程序。 安装将立即返回退出代码0.但是,似乎没有安装该程序。 文件未复制到位,并且未创建任何快捷方式。 查看日志文件很困难,因为它没有简单的成功或失败消息。 当我以普通管理员帐户运行服务时,它运行正常。 我终于在日志文件中注意到它说了

确定每台计算机上安装了现有产品(此产品或正在升级的产品)。

它未在控制面板>程序中列出,但出于某种原因,Windows认为它已经安装。 不幸的是,运行msiexec /x卸载程序也没有任何效果。

我尝试更改产品代码和升级代码,而中提琴,它的工作原理。 就我而言,我控制了安装产品代码和升级代码,所以我可以这样做。 如果在其他人的情况下,你没有这样的访问权限,你可能会尝试安装一些其他任意软件(它将有不同的产品/升级代码)并查看是否有效,如果有,至少你知道这就是问题所在。

我也有上述相同的任务,我发现如果为所有用户安装了程序,运行msiexec将在SYSTEM帐户下运行Service。 因此,要使其工作,您必须为所有用户安装。 在我的例子中,我在首次安装程序时指定了msxexec命令,如下所示。

 msiexec /i setup.msi ALLUSERS="1" 

完成此操作后,您只需从服务升级程序即可。

您可能需要使用允许您控制升级的REINSTALLMODE参数。 如果没有提供它们,安装可能会无声升级您的应用程序(或者至少是我发现的那个,尽管我仍然不确定在System.Diagnostics.Process.Start下是否适用相同的行为):

 msiexec.exe /i /quiet yourinstaller.msi REINSTALL=All REINSTALLMODE=vomus 

有关可以传递给msiexec.exe的各种标志的详细信息,请参阅此处 。