Windows services 从msi安装程序启动依赖于msi安装的程序集的服务

Windows services 从msi安装程序启动依赖于msi安装的程序集的服务,windows-services,windows-vista,wix,windows-installer,privileges,Windows Services,Windows Vista,Wix,Windows Installer,Privileges,我正在使用WiX编写一个MSI安装程序来启动一个依赖于MSI安装的dll的服务。在Vista上,DLL将在MSI的InstallFinalize阶段添加到全局程序集缓存中,因此我无法在WiX中使用内置的服务启动命令。在DLL在GAC中之前尝试启动服务,但失败。解决方案似乎是使用自定义操作[1],并在InstallFinalize之后运行该操作 我使用的自定义操作是使用sc启动服务。以管理员身份运行安装程序时,一切正常,但以普通用户身份运行则不起作用。安装程序将提升实际安装阶段的权限,但在完成安装

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

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

最后一个难题是,我试图向WiX文件添加
Privileged
,告诉用户安装程序需要以管理员身份运行,但我也无法实现。
Privileged
值在安装过程中设置为1,可能是在主安装序列被授予更高的权限时

那么,有没有其他人遇到过Vista、非管理员用户、安装程序需要启动服务以及服务需要在安装过程中进入GAC才能运行的情况?有没有一种通用的工作方法

[1]


[2]

这是其中一个最简单的解决方案,就是安排重新启动。

以下是一些可能性:

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

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

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


    • 我同意@sascha。在这种情况下,重新启动不仅最简单,而且最干净。所有其他建议的解决方案都将使您在未来面临更高的故障率。嗯,Windows安装程序设计w.r.t.GAC被摧毁了。重新启动就是对这一点的认可。

      您的服务是否可以使用非管理权限(即普通用户)启动?如果是系统服务,则很可能不是这样。或者我误解了您的问题,您以管理员身份安装,但没有获得启动服务的提升令牌?该服务需要执行需要管理员权限的操作,因此不能由普通用户运行。当以管理员身份安装(例如,从管理员控制台)时,一切都正常。问题是,当以普通用户身份运行安装程序时,如何使其使用权限提升。如果服务需要启动管理权限,则普通用户将无法启动它,因此我猜您运气不好。