18

我有以下 .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>

这不起作用,因为如果使用 < 5.0 的安装程序,该MsiServiceConfigFailureActions将不起作用,即使使用InstallerVersion="500"我得到的唯一东西是错误:

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

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

所以......使用 aCustomAction是要走的路(或不是?)。

我有以下日志输出

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: SELECT MessageFROM ErrorWHERE Error= 1722
MSI (c) (2C:0C) [13:56: 46:914]:字体已创建。字符集:Req=0,Ret=0,字体:Req=MS Shell Dlg,Ret=MS Shell Dlg

错误 1722。此 Windows 安装程序包有问题。作为设置的一部分运行的程序未按预期完成。请联系您的支持人员或软件包供应商。Action ServiceRestarter,位置:C:\Program Files (x86)\My Company\My Product\,命令:“C:\Windows\SysWOW64\sc.exe”失败“我的产品”reset= 60 actions= restart/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:MessageError哪里选择Error= 1709
MSI (s) (34:28) [13:56:48:849]:产品:我的产品 -- 错误 1722。此 Windows 安装程序包有问题。作为设置的一部分运行的程序未按预期完成。请联系您的支持人员或软件包供应商。Action ServiceRestarter,位置:C:\Program Files (x86)\My Company\My Product\,命令:“C:\Windows\SysWOW64\sc.exe”失败“My Product”reset=60 actions=restart/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 进行构建......那么我该如何调整构建命令?

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

4

3 回答 3

23

我可以看到您只尝试了 MSI 5.0 附带的 ServiceConfig 元素。但是,UtilExtension 中还有另一个 ServiceConfig 元素,它已经存在了很长时间,您在问题中提到的线程似乎证实了它的工作原理。

util:ServiceConfig元素包含 3 个您想使用的参数:和,FirstFailureActionType它们都接受相同的值枚举- 、和。SecondFailureActionTypeThirdFailureActionTypenonerebootrestartrunCommand

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

于 2012-09-18T12:36:48.767 回答
12

对于使用 VS2015 构建的 WIX V 4.0,以下工作:

1:确保WIX项目引用了WixUtilExtension.dll程序集。

2:将http://wixtoolset.org/schemas/v4/wxs/util ns 添加到根 Wix 元素。请注意,这是 WIX 4.0 的正确 NS(不像以前的版本那样http://schemas.microsoft.com/wix/UtilExtension )。

<Wix
  xmlns="http://wixtoolset.org/schemas/v4/wxs"
  xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"
  >

3:确保 ServiceConfig 元素以正确的命名空间引用为前缀。

<ServiceInstall
      Id="MyService"
      Type="ownProcess"
      Name="MyService"
      DisplayName="MyService"
      Description="My Service"
      Start="auto"
      Account="[SERVICEACCOUNT]"
      Password="[SERVICEPASSWORD]"
      ErrorControl="normal"
    >

      <util:ServiceConfig
        FirstFailureActionType='restart'
        SecondFailureActionType='restart'
        ThirdFailureActionType='restart'            
        RestartServiceDelayInSeconds='30'
        ResetPeriodInDays='1'/>

</ServiceInstall>
于 2016-01-21T13:44:52.130 回答
1

在 Visual Studio 中,为避免在 CLI 中使用 -ext,您可以执行以下操作:

当然,你添加一个资源:<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

然后,在解决方案资源管理器 -> 参考 -> 添加.. WixUtilExtension.dll

在那之后,一切都像一个魅力。(蜡 3.10)

当然,如果您确实使用了 utils 中的第二个 ServiceConfig。像<util:ServiceConfig blablabla

于 2017-02-06T17:15:53.253 回答