3

我正在使用 WiX 编写 MSI 安装程序来启动依赖于 MSI 安装的 DLL 的服务。在 Vista 上,DLL 在 MSI 阶段被添加到全局程序集缓存中InstallFinalize,因此我无法使用 WiX 中的内置服务启动命令。那个尝试在 DLL 进入 GAC 之前启动服务,但失败了。解决方案似乎是改用自定义操作 [1],然后在InstallFinalize.

我使用的自定义操作是使用sc. 以管理员身份运行安装程序时一切正常,但以普通用户身份运行则不起作用。安装程序将提升实际安装阶段的权限,但在完成安装后将删除它们,并且sc以非特权用户身份启动服务将失败。InstallFinalize在[2]之后,将自定义操作设置为延迟和不模拟以获取管理员权限也不起作用。

最后,我尝试添加<Condition>Privileged</Condition>到 WiX 文件以告诉用户安装程序需要以管理员身份运行,但我也无法让它工作。该Privileged值在安装过程中设置为 1,可能是在主安装序列被赋予更高权限时。

那么有没有其他人遇到过 Vista、非管理员用户、安装程序需要启动服务和服务需要在安装过程中进入 GAC 才能运行的组合?有什么通用的方法可以解决这个问题吗?

[1] http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg09162.html

[2] http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg15381.html

4

3 回答 3

2

这是最简单的解决方案只是安排重新启动的时候之一。

于 2009-10-15T20:43:30.573 回答
1

这里有几种可能性:

  • 如果可能,不要在 GAC 中安装必备程序集。这将允许您的服务正常启动(即在InstallInitialize 和InstallFinalize 之间)。

  • 创建一个引导程序(一个按特定顺序启动必备 MSI 的小应用程序)。将必备程序集(那些进入 GAC 的程序集)放入它们自己的 MSI,并让引导程序在安装您的服务之前安装它们。

  • 创建一个启动器(一个更小的应用程序,只启动您的 MSI)。给它一个清单,让它运行提升。这样,整个 MSI 都被提升了,而不仅仅是 InstallInitialize 和 InstallFinalize 之间的部分。您应该能够sc成功调用。

于 2009-10-16T20:22:00.473 回答
1

我同意@sascha。在这种情况下,重新启动不仅是最简单而且最干净的。所有其他提出的解决方案都将使您在未来面临更高的故障率。恕我直言,GAC 的 Windows Installer 设计被破坏了。重新启动是对这一点的认可。

于 2009-10-19T15:38:59.430 回答