从 windows 服务本地服务帐户静默安装 msi

Silent install msi from a windows service local service account

我正在建立一个自动更新机制。 windows 服务 运行 在负责自动更新 msi 的本地服务帐户上。

该服务下载 msi 文件,然后尝试使用此代码安装它:

Process process = new Process();
process.StartInfo.FileName = "msiexec.exe";
process.StartInfo.Arguments = string.Format(" /i \"{0}\" /qn /norestart ALLUSERS=1", sMSIPath);
process.Start();
process.WaitForExit();

其中 sMSIPath 是表示文件路径的字符串,例如 "C:\test.msi"。

这段来自常规控制台应用程序的代码似乎 运行 没问题。例如,我设法静默安装了 adobe reader。

但是从我的 windows 服务来看,它什么也没做。根据日志,我收到一条警告消息: 无法连接服务器。错误:0x80070005 用户所在的位置 "LOCAL SERVICE"(正如我提到的,我的 windows 服务 运行 是本地服务)。

此外,这些项目的目标是 x86,但我 运行 正在使用 64 位 OS。 (我在 x86 上需要它们,我希望这个软件能够 运行 在多个操作系统上)。

任何帮助都非常受欢迎。 非常感谢!

  1. 打开服务管理控制台开始->运行->Services.msc
  2. 右键单击您的服务并转到属性
  3. 在 属性 页上 select 第二个选项卡,即 "Log On"
  4. 选中名为 "Allow Service to interact with desktop" 的复选框。

我认为你完成这项工作的机会不大。如果 MSI 尝试访问桌面、用户程序菜单、CommonFilesFolder(不是完整列表)等文件夹或查看 LogonUser 属性 和任何其他内容,它将失败,因为在交互式用户的正常安装中这些都是与该安装用户相关联的所有有效属性。当安装用户是 localservice 时,您可能会一团糟。

如果您需要这样做,请将服务配置为 运行 作为有效的管理员帐户 - 这可能会让您有机会更好地工作。无法连接到服务器错误可能是因为 MSI 文件预计来自某种用户帐户 运行。

Harry Johnston 是对的,本地服务没有这样做的特权。本地系统运行良好,所以我将使用本地系统帐户。

感谢您的回答,他们都很有帮助!