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

时间:2010-04-08 22:48:14

标签: c# service windows-services wix windows-installer

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

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

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

我们只是在做:

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

4 个答案:

答案 0 :(得分:5)

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

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

  2. 转到登录标签

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

  4. 重启服务

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

答案 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