我想修改MSI安装程序(通过WiX创建)以在卸载时删除整个目录.
我理解WiX中的选项RemoveFile和RemoveFolder选项,但是它们不够强大,无法递归删除安装后创建内容的整个文件夹.
我注意到类似的Stack Overflow问题在卸载WiX时删除文件,但我想知道是否可以通过调用批处理脚本删除文件夹来更简单地完成此操作.
这是我第一次使用WiX,而且我仍然掌握了自定义操作.在卸载时运行批处理脚本的自定义操作的基本示例是什么?
我正在努力让MajorUpgrade,ServiceControl,.config文件很好地协同工作. 在我的另一个问题之后,我现在又有了相反的问题.
以前,文件没有被覆盖,因为AssemblyFileVersions是静态的所以我修复了它. 1)现在,即使Schedule="afterInstallExecute"我的KeyPath='yes' .config文件仍被覆盖,即使现有文件修改日期与文件创建日期不同,它也被设置为KeyPath.我目前不得不覆盖.config文件并在安装后重新启动服务.
2)即使我解决了这个问题,我仍然有一个避免重启的问题.如果我说Schedule="afterInstallInitialize"那么我相信.config文件肯定会过早地与服务一起删除.如果我说Schedule="afterInstallExecute"那么服务没有停止,安装后需要重新启动.(那是对的,对吗?)在安装之前手动停止服务让我避免重启.添加net stop自定义操作可能会取代ServiceControl我的想法,但是正确地获得所有条件似乎很复杂.
3)作为奖励,我想在升级期间根本不删除服务.我可以停止服务,替换二进制文件,然后再次启动服务吗?这将避免重新输入服务帐户凭据以进行升级.但是当然它仍然需要在首次安装时卸载并卸载功能.
这是它的主要内容(以后也捆绑在一起,以防万一在某种程度上很重要):
<MajorUpgrade DowngradeErrorMessage="A newer version is already installed."
Schedule="afterInstallExecute" />
<ComponentGroup Id="ServiceCG">
<Component Id="Service" Guid='*' Win64='yes' Directory='INSTALLDIR'>
<File Id='ServiceEXE' Source='$(var.root)Service.exe' />
<ServiceInstall Id="ServiceInstall"
Name="MyService"
DisplayName="My Server"
Type="ownProcess"
Start="auto"
ErrorControl="normal"
Description="My Server Service"
Interactive="no"
Account="[...]"
Password="[...]" />
<ServiceControl Id="StopService" Name="MyService" Start="install"
Stop="uninstall" Wait="yes" Remove="both" />
<util:User Id="UpdateServiceAccountLogonAsService" …Run Code Online (Sandbox Code Playgroud) 我正在尝试阻止我的服务在我的WiX安装程序中的主要升级中丢失其设置(凭据和其他选项).我按照这里的建议,我正在尝试使用
<InstallExecuteSequence>
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
但我的服务仍在重新升级,在每次升级时丢失我的凭据和其他服务设置.
在日志中,看起来我的状况只被尊重一次.我知道了
MSI (s) (6C:E8) [16:52:53:944]: Skipping action: DeleteServices (condition is false)
Run Code Online (Sandbox Code Playgroud)
然后几百行后,我明白了
MSI (s) (6C:A4) [16:52:54:873]: Doing action: DeleteServices
Run Code Online (Sandbox Code Playgroud)
所以在我看来,第二个DeleteServices是我的问题.任何人都可以告诉我如何压制第二个,或者我正在做什么导致它?
我正在使用WiX工具集3.7.这是我的代码,显然删除了guid.
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id='*' Name='My Product' Language='1033'
Version='1.0.6' Manufacturer='Me' UpgradeCode='PUT-GUID-HERE' >
<Package Description='My Product' Platform='x86' Id='*'
Manufacturer='Me' InstallerVersion='200' Compressed='yes' />
<MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."/>
<InstallExecuteSequence>
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
</InstallExecuteSequence>
<Media Id='1' Cabinet='product.cab' EmbedCab='yes' />
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<Directory Id='AgentDir' Name='Agent'> …Run Code Online (Sandbox Code Playgroud) 我有一个常见的场景,但我很难让事情完全发挥作用.
这个场景非常简单,我想对产品进行重大升级,而无需更改服务设置,也无需重启.
我主要通过在DeleteServices上使用条件NOT UPGRADINGPRODUCTCODE来工作.但是,在升级期间不会停止服务,因此需要重新启动.
升级是否有某种方法可以停止服务,安装新文件并重新启动服务而无需删除/安装服务?
我正在使用WiX处理MSI安装程序.我试图尽可能简化开发:这是一个内部产品,我的用户就是我们的IT人员.
该产品包括一个Windows服务,必须配置为在每台计算机的不同帐户下运行.
我为我的用户规划的工作流程(首次安装)如下:
sc或本地服务小程序停止服务后续更新将包括从更新的MSI文件安装.
测试"小"更新时,我惊讶地发现安装程序将服务重置为在默认帐户下运行.这对我来说是一个主要问题,因为它使我的用户很难更新他们的服务器.每次有更新时,他们都必须在每台机器上重新输入帐户信息.我预计会发生"重大"更新,但不是"小"更新.
有没有办法配置安装程序,以便它不会在"小"或"次要"更新期间更改服务的现有帐户/密码配置?
这也会在"修复"过程中发生(我还没试过)?
这是我的组件在.wxs文件中的样子:
<Component Id="cmpService" Guid="{MYGUIDHERE}">
<File Id="filService" KeyPath="yes" Name="ServiceApp.exe" />
<ServiceInstall Id="ServiceInstall" Name="ServiceApp" DisplayName="My Service"
Type="ownProcess" Start="auto" ErrorControl="normal"
Account="LocalSystem">
<util:PermissionEx ... attributes here... />
</ServiceInstall>
<ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall"
Name="ServiceApp" Wait="yes" />
</Component>
Run Code Online (Sandbox Code Playgroud)
Remove="uninstall"如果没有任何变化,我原本预计会保留服务.显然不是.(如果在"主要"更新中发生这种情况,我不会太担心).
我还注意到ServiceConfig元素的属性(OnReinstall)似乎符合条件,但基于蜡烛错误消息,很明显,它OnReinstall只是为了影响元素的配置成员(PreShutdownDelay等等)而不是服务安装.整个.
我调查过这些:
奇怪的是,这个答案表明这只是"主要"升级的问题.那不是我的经历.我的经历是侥幸吗?
在安装过程中提示输入帐户和密码会很好,但是在这种情况下将密码存储在注册表或其他地方并不是一个真正的选择,并且必须在每次更新时重新输入凭据就像必须重新配置一样具有破坏性.手工服务.