我有以下.wxs文件:

<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="x.x.x.x" ?>
<?define UpgradeCode="{**MYGUID**}" ?>
<?define Manufacturer="My Company" ?>
<?define ProductName="My Product" ?>
<?define SkuName="MyProduct" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*"
             Name="$(var.ProductName)"
             Language="1033"
             Version="$(var.ProductVersion)"
             Manufacturer="$(var.Manufacturer)"
             UpgradeCode="$(var.UpgradeCode)">
        <Package InstallerVersion="301"
                 Compressed="yes"
                 InstallPrivileges="elevated"
                 InstallScope="perMachine"
                 Platform="x86" />
        <Media Id="1"
               Cabinet="$(var.SkuName).cab"
               EmbedCab="yes" />
        <Directory Id="TARGETDIR"
                   Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="ManufacturereDirectory"
                           Name="$(var.Manufacturer)">
                    <Directory Id="ProductDirectory"
                               Name="$(var.ProductName)" />
                </Directory>
            </Directory>
        </Directory>
        <ComponentGroup Id="MainComponentGroup">
            <Component Directory="ProductDirectory">
                <File Name="$(var.MyProject.TargetFileName)"
                      Source="$(var.MyProject.TargetPath)"
                      KeyPath="yes"
                      Vital="yes" />
                <ServiceInstall Id="SeviceInstall"
                                Name="$(var.ProductName)"
                                DisplayName="$(var.ProductName)"
                                Type="ownProcess"
                                Interactive="no"
                                Start="auto"
                                Vital="yes"
                                ErrorControl="normal"
                                Account="LOCALSYSTEM">
                </ServiceInstall>
                <ServiceControl Id="ServiceControl_Start"
                                Name="$(var.ProductName)"
                                Start="install"
                                Wait="no" />
                <ServiceControl Id="ServiceControl_Stop"
                                Name="$(var.ProductName)"
                                Stop="both"
                                Remove="uninstall"
                                Wait="yes" />
            </Component>
        </ComponentGroup>
        <Feature Id="MainFeature"
                 Level="1">
            <ComponentGroupRef Id="MainComponentGroup" />
        </Feature>
        <Upgrade Id="$(var.UpgradeCode)">
            <UpgradeVersion Property="UPGRADEFOUND"
                            Minimum="0.0.0.1" IncludeMinimum="yes"
                            Maximum="$(var.ProductVersion)" IncludeMaximum="yes"
                            OnlyDetect="no"
                            IgnoreRemoveFailure="yes"
                            MigrateFeatures="yes"/>
        </Upgrade>
        <CustomAction Id="ServiceRestarter"
                      Directory="ProductDirectory"
                      ExeCommand="&quot;[SystemFolder]sc.exe&quot; failure &quot;$(var.ProductName)&quot; reset= 60 actions= restart/0"
                      Impersonate="no" />
        <InstallExecuteSequence>
            <InstallExecute Before="RemoveExistingProducts" />
            <RemoveExistingProducts Before="InstallFinalize" />
            <Custom Action="ServiceRestarter" After="InstallFinalize"><![CDATA[NOT Installed]]></Custom>
        </InstallExecuteSequence>
    </Product>
</Wix>


在此之前,我尝试过:

<CustomAction Id="ServiceRestarter"
              Property="QtExecCmdLine"
              Value='"[SystemFolder]sc.exe" failure "$(var.ProductName)" reset= 60 actions= restart/0' />


显然叫做sc.exe-但什么也没改变...

在此之前,我尝试过:

<ServiceInstall Id="SeviceInstall"
                Name="$(var.ProductName)"
                DisplayName="$(var.ProductName)"
                Type="ownProcess"
                Interactive="no"
                Start="auto"
                Vital="yes"
                ErrorControl="normal"
                Account="LOCALSYSTEM">
    <ServiceConfig Id="ServiceConfig"
                   DelayedAutoStart="yes"
                   OnInstall="yes"
                   OnReinstall="yes"
                   OnUninstall="no"
                   FailureActionsWhen="failedToStopOrReturnedError" />
    <ServiceConfigFailureActions Id="ServiceRestarter"
                                 OnInstall="yes"
                                 OnReinstall="yes"
                                 OnUninstall="no"
                                 ResetPeriod="0">
        <Failure Action="restartService" Delay="0" />
        <Failure Action="restartService" Delay="0" />
        <Failure Action="restartService" Delay="0" />
    </ServiceConfigFailureActions>
</ServiceInstall>


这不起作用,因为如果使用安装程序MsiServiceConfigFailureActions table不起作用,即使使用InstallerVersion="500",我唯一得到的是一个错误:


无法配置“我的产品”(我的产品)。这可能
软件包或您的权限有问题。验证你
具有足够的特权来配置系统服务。


(是的,...我也尝试过InstallPrivilges="elevated"-但根据this,真正的问题是Action="restartService"

所以...使用CustomAction是可行的方法(还是不可以?)。

我有以下日志输出


MSI(s)(34:28)[13:56:46:914]:注意:1:1722 2:ServiceRestarter 3:C:\ Program Files(x86)\ My Company \ My Product \ 4:“ C:\ Windows \ SysWOW64 \ sc.exe“失败”我的产品“重置= 60操作=重新启动/ 0
MSI(s)(34:28)[13:56:46:914]:注意:1:2205 2:3:错误
MSI(s)(34:28)[13:56:46:914]:注:1:2228 2:3:错误4:从Message哪里Error = 1722选择Error
MSI(c)(2C:0C)[13:56:46:914]:创建的字体。字符集:Req = 0,Ret = 0,字体:Req = MS Shell Dlg,Ret = MS Shell Dlg

错误1722。此Windows Installer程序包有问题。作为安装程序一部分运行的程序未按预期完成。请与您的支持人员或包装供应商联系。操作ServiceRestarter,位置:C:\ Program Files(x86)\ My Company \ My Product \,命令:“ C:\ Windows \ SysWOW64 \ sc.exe”失败“我的产品”重置= 60操作=重新启动/ 0
MSI(s)(34:28)[13:56:48:849]:注意:1:2205 2:3:错误
MSI(s)(34:28)[13:56:48:849]:注意:1:2228 2:3:错误4:在Message位置Error = 1709中选择Error
MSI(s)(34:28)[13:56:48:849]:产品:我的产品-错误1722。此Windows Installer软件包存在问题。作为安装程序一部分运行的程序未按预期完成。请与您的支持人员或包装供应商联系。操作ServiceRestarter,位置:C:\ Program Files(x86)\ My Company \ My Product \,命令:“ C:\ Windows \ SysWOW64 \ sc.exe”失败“我的产品”重置= 60操作=重新启动/ 0

动作结束于13:56:48:ServiceRestarter。返回值3。
行动结束于13:56:48:安装。返回值3。


有人可以帮我吗?

编辑

我使用了旧的ServiceConfig扩展名:

<util:ServiceConfig xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
                    FirstFailureActionType="restart"
                    SecondFailureActionType="restart"
                    ThirdFailureActionType="restart"
                    ResetPeriodInDays="1"
                    RestartServiceDelayInSeconds="20" />


这给了我以下的构建错误:


错误CNDL0200:ServiceInstall元素包含未处理的
扩展元素'util:ServiceConfig'。请确保
元素中的扩展
http://schemas.microsoft.com/wix/UtilExtension”命名空间已
提供。


我知道我可以通过命令行使用-ext WixUtilExtension来解决此错误-但我想使用Visual Studio进行构建...那么如何修改build-command?

唯一的机会是在我的项目中添加对WixUtilExtension.dll的引用。

最佳答案

我可以看到您只尝试了MSI 5.0附带的ServiceConfig元素。但是,有another ServiceConfig element in UtilExtension,它已经存在了很长时间了,看来the thread you mention in your question confirms可以工作了。

util:ServiceConfig元素包含您要使用的3个参数:FirstFailureActionTypeSecondFailureActionTypeThirdFailureActionType,它们都接受相同的值枚举-nonerebootrestartrunCommand

尝试一下,如果可行,它是比自定义操作更好的选择。

关于wix - 如何使用WiX设置服务的恢复选项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12476607/

10-14 16:35