好的,我知道如何使用WiX部署服务,但我正试图解决以下两难问题。我想在主要升级时保留服务配置(例如登录凭据等)(这样用户就不必重新定义服务设置)。为此,在InstallExecuteSequence中,我使用:
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
我将 ServiceControl 的停止属性设置为两者。但是,当我卸载应用程序时,如果服务正在运行,我会收到以下警告:
“设置必须更新系统运行时无法更新的文件或服务。如果选择继续,则需要重新启动才能完成设置。”
如果我选择继续并且不重新启动,则服务和所有应用程序文件都会被删除,因此此消息似乎完全是假的。如果我在运行卸载程序之前手动停止服务,则不会出现警告。
我做错了吗?在确保在主要升级时不会删除(并重新创建)服务时,我需要做些什么来避免此警告?
答案 0 :(得分:0)
嗯,好问题, 据我所知,问题是在你处理DeleteServices之后服务没有停止,这看起来很奇怪,因为执行顺序的顺序是:
* StopServices
• DeleteServices
• RemoveFiles
• InstallFiles
• InstallServices
• StartServices
我会试试这个:
<DeleteServices After="StopServices" Before="RemoveFiles">NOT UPGRADINGPRODUCTCODE</DeleteServices>
<InstallServices>NOT UPGRADINGPRODUCTCODE</InstallServices>
但是对于实际问题,这看起来有点可疑,我会做的是创建所有必要的注册表键/值来保存有关注册表的信息,而不是再次询问它以升级产品。然后,您可以再次将该信息传递给服务,并且不必弄乱您的设置(这对于属性,组件条件,registrySearch来说非常简单)。
如果您想在升级时添加新服务怎么办? Ps,您可以创建新用户,为他分配安装权限,并使用该用户登录进行服务。我知道还有更多要记住,但没有太复杂。
答案 1 :(得分:0)
一种技术是使用remember property pattern的修改版本。你想要添加一些加密。
问题是MSI被设计为拥有配置的定义。如果配置发生变化,其中一个必须获胜。 MSI可以很好地处理文本/配置文件(用户数据通过创建日期和修改日期比较保留),但对于像服务这样的东西,没有检查。
现在,如果有人更改了服务凭证,则会使用“记住”属性并将其更改回来。
一个棘手的问题,有时没有真正的解决方案。一种方法是始终安装为NetworkService或SYSTEM,并使用这些凭据和配置文件更改应用程序的设计。 (简化问题。)