Windows services 从msi安装程序启动依赖于msi安装的程序集的服务
我正在使用WiX编写一个MSI安装程序来启动一个依赖于MSI安装的dll的服务。在Vista上,DLL将在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启动服务。以管理员身份运行安装程序时,一切正常,但以普通用户身份运行则不起作用。安装程序将提升实际安装阶段的权限,但在完成安装
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被摧毁了。重新启动就是对这一点的认可。您的服务是否可以使用非管理权限(即普通用户)启动?如果是系统服务,则很可能不是这样。或者我误解了您的问题,您以管理员身份安装,但没有获得启动服务的提升令牌?该服务需要执行需要管理员权限的操作,因此不能由普通用户运行。当以管理员身份安装(例如,从管理员控制台)时,一切都正常。问题是,当以普通用户身份运行安装程序时,如何使其使用权限提升。如果服务需要启动管理权限,则普通用户将无法启动它,因此我猜您运气不好。