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

时间:2015-01-16 14:10:35

标签: c# .net windows-services windows-installer silent-installer

我正在构建一个自动更新机制。在本地服务帐户上运行的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 用户是“本地服务”(如我所述,我的Windows服务作为本地服务运行)。

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

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

3 个答案:

答案 0 :(得分:1)

  1. 打开服务管理控制台开始 - >运行 - > Services.msc
  2. 右键点击您的服务,然后转到属性
  3. 在属性页面上选择第二个选项卡,即“登录”
  4. 选中“允许服务与桌面交互”复选框。

答案 1 :(得分:1)

我认为你没有太多机会做这项工作。如果MSI尝试访问像Desktop,用户程序菜单,CommonFilesFolder(不是完整列表)这样的文件夹,或者查看LogonUser属性以及任何其他内容,它将失败,因为在交互式用户的正常安装中这些都是有效的与该安装用户关联的属性。当安装用户是本地服务时,你可能会陷入混乱。

如果您需要这样做,请将服务配置为以有效的管理员帐户运行 - 这可能会让您有机会更好地运作。连接到服务器错误的失败可能是因为MSI文件应该从某种用户帐户运行。

答案 2 :(得分:0)

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

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