Windows services WiX 3.7:安装Windows服务以实现优雅升级和无缝卸载的正确方法是什么?

Windows services WiX 3.7:安装Windows服务以实现优雅升级和无缝卸载的正确方法是什么?,windows-services,wix,wix3.7,Windows Services,Wix,Wix3.7,好的,我知道如何使用WiX部署服务,但我正在尝试解决以下难题。我希望在主要升级时保留服务配置,例如登录凭据等,以便用户不必重新定义服务设置。为此,在InstallExecuteSequence中,我使用: <DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 我已将ServiceControl的停止属性设置为两者。但是,当我卸载应用程序时,如果服务正在运行,我会收到以下警告: 安装程序必须更新系统运行时无法更

好的,我知道如何使用WiX部署服务,但我正在尝试解决以下难题。我希望在主要升级时保留服务配置,例如登录凭据等,以便用户不必重新定义服务设置。为此,在InstallExecuteSequence中,我使用:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
我已将ServiceControl的停止属性设置为两者。但是,当我卸载应用程序时,如果服务正在运行,我会收到以下警告:

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

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

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

好的,问得好, 据我所知,问题在于,在您处理DeleteServices之后,服务并没有停止,这似乎有些奇怪,因为执行顺序是:

* StopServices
• DeleteServices
• RemoveFiles
• InstallFiles
• InstallServices
• StartServices
我想试试这个:

<DeleteServices After="StopServices" Before="RemoveFiles">NOT UPGRADINGPRODUCTCODE</DeleteServices>
<InstallServices>NOT UPGRADINGPRODUCTCODE</InstallServices>
但对于实际问题,这似乎有点可疑,我要做的是创建所有必要的注册表项/值,以保留有关注册表的信息,而不是再次要求它升级产品。然后,您可以稍后将该信息再次传递给服务,而不必干扰您的设置。这对于属性、组件条件和注册表搜索来说非常容易

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

一种技巧是使用。不过,您需要添加一些加密

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

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


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

Hmmmm。。。DeleteServices元素似乎没有After或Before属性。唯一支持的属性是Sequence和Suppress。我在Orca中检查了MSI文件,StopServices操作的序列号为1900,而DeleteServices和RemoveFiles分别为2000和3600,因此从序列的角度来看都很好。对,但在某些情况下,系统或其他内置帐户无法工作,例如,当服务需要对用户存储使用DPAPI加密,或访问Active Directory,或使用集成Windows身份验证连接到数据库服务器或web服务时,等等,进入“记住属性模式”位置来存储敏感数据(如帐户密码)会引发比我首先要解决的问题更严重的问题,例如,如何对其进行加密?您在哪里存储加密密钥?如何保护加密密钥?如果帐户密码更改,并且用户更新了“服务”控制面板中的登录信息,该怎么办?但是MSI不知道这些信息吗?etc.NetWorkService使用AD计算机帐户,您可以授予该对象对其他网络资源的访问权限。Windows Installer在这方面缺乏,因此您必须找出一些办法。只是不点击标准操作并不能解决问题。当然,但在大多数情况下,如果部署企业应用程序,由于信息安全限制,您将无法运行作为NetworkServices帐户访问某种特权资源的Windows服务。通常,在这种情况下,将使用具有定义生命周期、审核等功能的通用AD帐户。无论如何,我想说的是,在某些情况下,作为内置帐户运行windows服务不是一个选项,如果是,不使用它将是愚蠢的。你找到解决方案了吗?哦,伙计,这是很久以前的事了,所以不记得了,但这是我在产品WIX文件中看到的:!-不要在升级时删除Windows服务配置。->未升级产品代码未检测到WIX_UPGRADE_请告诉我是否有效。我将把它添加到答案中,或者你也可以这样做。