1

好的,我知道如何使用 WiX 来部署服务,但我正在尝试解决以下困境。我想在主要升级时保留服务配置(例如登录凭据等)(这样用户就不必重新定义服务设置)。为此,在 InstallExecuteSequence 内部,我使用:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>

我将ServiceControlStop属性设置为both。但发生的情况是,当我卸载应用程序时,如果服务正在运行,我会收到以下警告:

“安装程序必须更新系统运行时无法更新的文件或服务。如果您选择继续,则需要重新启动才能完成安装程序。”

如果我选择继续并且不重新启动,则服务和所有应用程序文件都会被删除,所以这条消息似乎完全是假的。如果我在运行卸载程序之前手动停止服务,则不会出现警告。

难道我做错了什么?我需要做些什么来避免此警告,同时确保服务不会在重大升级时被删除(和重新创建)?

4

2 回答 2

0

好吧,好问题,据我了解,问题是服务没有停止,在你处理 DeleteServices 之后,这似乎很奇怪,因为执行顺序是:

* StopServices
• DeleteServices
• RemoveFiles
• InstallFiles
• InstallServices
• StartServices

我会试试这个:

<DeleteServices After="StopServices" Before="RemoveFiles">NOT UPGRADINGPRODUCTCODE</DeleteServices>
<InstallServices>NOT UPGRADINGPRODUCTCODE</InstallServices>

但是对于实际问题,这似乎有点可疑,我要做的是创建所有必要的注册表项/值以保留有关注册表的信息,而不是再次询问它以升级产品。然后您可以稍后将该信息再次传递给服务,而不必弄乱您的设置(这对于属性、组件条件、registrySearch 来说非常容易)。

如果您想在升级时添加新服务怎么办?Ps,您可以创建新用户,为他分配安装权限,并使用该用户登录以进行服务。我知道还有更多要记住的,但没有什么太复杂的。

于 2013-10-25T10:32:46.293 回答
0

一种技术是使用记忆属性模式的修改版本。不过,您想添加一些加密。

问题是 MSI 被设计为自己定义配置。如果配置发生变化,其中之一必须获胜。MSI 可以很好地处理文本/配置文件(通过创建日期和修改日期比较保留用户数据),但对于诸如服务之类的东西没有检查。

现在,如果有人更改了服务凭据,则将使用 remember 属性并将其更改回来。

一个棘手的问题,有时没有真正的解决方案。一种方法是始终安装为 NetworkService 或 SYSTEM 并更改应用程序的设计以适应这些凭据和配置文件。(简化问题。)

于 2013-10-25T13:13:09.197 回答