如何通过WiX配置Windows服务恢复选项及解决权限问题
WiX服务恢复配置问题解答
1. WiX的ServiceInstall能否直接配置服务恢复选项?
不能。Windows Installer原生的ServiceInstall表没有提供配置服务恢复选项的字段,WiX的ServiceInstall组件也没有对应的属性支持直接设置恢复策略,必须通过自定义动作调用系统工具实现。
2. 通过sc.exe设置服务恢复选项的实现方式
需要创建WiX自定义动作,调用系统自带的sc.exe执行failure命令,核心命令格式如下:
sc failure [服务名] reset= [重置时间(秒)] actions= [动作/延迟时间,...]
关键要确保自定义动作在系统上下文下执行,拥有修改服务配置的管理员权限。
3. 自定义动作代码的放置位置
你提供的自定义动作代码必须放在<Package>节点内部,与<Feature>、<InstallExecuteSequence>等节点同级。同时要修正两个关键问题:
Directory属性要匹配包中实际存在的目录ID(你的包中是INSTALLFOLDER_,不是INSTALLFOLDER)- 执行时机和权限参数要设置正确
修正后的代码示例(可放在DirectoryRef节点之后、Feature节点之前):
<CustomAction Id="SetRecoveryOptions" Directory="INSTALLFOLDER_" Execute="deferred" Impersonate="no" ExeCommand="[SystemFolder]sc.exe failure MyWindowsService reset= 0 actions= restart/60000/restart/60000/restart/60000" Return="ignore" /> <InstallExecuteSequence> <Custom Action="SetRecoveryOptions" After="InstallServices" /> </InstallExecuteSequence>
4. 确保自定义动作以管理员权限执行
当前代码仅在管理员命令行有效,核心问题及修正方案如下:
- 修改执行上下文:
Execute="immediate"是用户上下文,无法获取系统级权限,必须改为Execute="deferred",让动作在系统上下文运行。 - 声明包的权限要求:在
<Package>节点添加InstallPrivileges="elevated"和InstallScope="perMachine",确保安装程序启动时自动请求管理员权限。 - 修正服务名拼写错误:你的
ServiceControl节点中服务名拼写为MyWIndowsServices,与ServiceInstall的MyWindowsService不一致,需统一避免服务启停失败。
完整修正后的包关键部分
<Package Name="$(Name)" Manufacturer="$(Manufacturer)" Version="$(Version)" UpgradeCode="$(var.UpgradeCode)" Compressed="true" InstallPrivileges="elevated" InstallScope="perMachine"> <!-- 其他原有节点保持不变 --> <CustomAction Id="SetRecoveryOptions" Directory="INSTALLFOLDER_" Execute="deferred" Impersonate="no" ExeCommand="[SystemFolder]sc.exe failure MyWindowsService reset= 0 actions= restart/60000/restart/60000/restart/60000" Return="ignore" /> <InstallExecuteSequence> <Custom Action="SetRecoveryOptions" After="InstallServices" /> </InstallExecuteSequence> <!-- Feature节点保持不变 --> </Package>
内容的提问来源于stack exchange,提问作者Duncan Groenewald
相关产品推荐
相关产品推荐

