我正在使用WiX编写MSI安装程序来启动依赖于MSI安装的DLL的服务。在Vista上,DLL会在MSI的InstallFinalize
阶段添加到全局程序集缓存中,因此我无法在WiX中使用内置服务启动命令。那个尝试在DLL在GAC之前启动服务,并且失败。解决方案似乎是使用自定义操作[1],并在InstallFinalize
之后运行。
我使用的自定义操作是使用sc
启动服务。以管理员身份运行安装程序时,一切正常,但以普通用户身份运行不起作用。安装程序将提升实际安装阶段的权限,但在完成安装后将删除它们,并且以sc
作为非特权用户启动服务将失败。在InstallFinalize
[2]之后,将自定义操作设置为延迟且不模仿以获取管理员权限将无效。
作为最终的kludge,我尝试将<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
答案 0 :(得分:2)
这是最简单的解决方案只是计划重新启动的时间之一。
答案 1 :(得分:1)
以下是一些可能性:
如果可能,请不要在GAC中安装必备组件。这将允许您的服务正常启动(即在InstallInitialize和InstallFinalize之间)。
创建一个bootstrapper(一个以特定顺序启动必备MSI的小应用程序)。将必备程序集(GAC中的那些程序集)放入它们自己的MSI中,并在安装服务之前让引导程序安装它们。
创建一个启动器(一个更小的应用程序,只需启动您的MSI)。给它一个清单,让它升高。这样,整个MSI都会升级,而不仅仅是InstallInitialize和InstallFinalize之间的部分。您应该能够成功调用sc
。
答案 2 :(得分:1)
我同意@sascha。在这种情况下,重新启动不仅是最简单但最干净的。所有其他提出的解决方案都将为您提供更高的故障率。恕我直言,Windows安装程序设计w.r.t. GAC被破坏了。重启是对此的认可。