Подтвердить что ты не робот

Как установить параметры восстановления службы WiX?

У меня есть следующий .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 не работает, если используется установщик < 5.0, и даже при использовании InstallerVersion="500" единственное, что я получаю, это ошибка:

Не удалось настроить Serivce 'My Product' (Мой продукт). Это могло, это может быть проблемой с пакетом или вашими разрешениями. Убедитесь, что вы имеют достаточные привилегии для настройки системных служб.

(и да... Я уже пробовал InstallPrivilges="elevated", но... реальная проблема - Action="restartService" в соответствии с this)

Итак... использование 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" сбой "Мой продукт" reset= 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 Message FROM Error ГДЕ Error= 1722
MSI (c) (2C: 0C) [13: 56: 46: 914]: Создан шрифт. Charset: Req = 0, Ret = 0, Font: Req = MS Shell Dlg, Ret = MS Shell Dlg

Ошибка 1722. Существует проблема с этим пакетом установщика Windows. Программа, выполняемая как часть настройки, не завершилась так, как ожидалось. Обратитесь к вашему персоналу службы поддержки или поставщику пакета. Действие ServiceRestarter, местоположение: C:\Program Files (x86)\My Company\My Product \, команда: "C:\Windows\SysWOW64\sc.exe" сбой "My Product" reset= 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: SELECT Message FROM Error WHERE Error= 1709
MSI (s) (34:28) [13: 56: 48: 849]: Продукт: Мой продукт - ошибка 1722. Существует проблема с этим пакетом установщика Windows. Программа, выполняемая как часть настройки, не завершилась так, как ожидалось. Обратитесь к вашему персоналу службы поддержки или поставщику пакета. Действие ServiceRestarter, местоположение: C:\Program Files (x86)\My Company\My Product \, команда: "C:\Windows\SysWOW64\sc.exe" сбой "My Product" reset= 60 действий = перезагрузка /0

Действие закончилось 13:56:48: ServiceRestarter. Возвращаемое значение 3.
Действие закончилось 13:56:48: УСТАНОВКА. Возвращаемое значение 3.

Кто-нибудь может мне помочь?

изменить

Я использовал старый ServiceConfig -extension:

<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 к моему проекту.

4b9b3361

Ответ 1

Я вижу, что вы только пробовали элемент ServiceConfig, который поставляется вместе с MSI 5.0. Однако там еще один элемент ServiceConfig в UtilExtension, который был там в течение длительного времени, и кажется, что поток, который вы упомянули в ваш вопрос подтверждает, что он работает.

Элемент util: ServiceConfig содержит 3 параметра, которые вы хотели бы использовать: FirstFailureActionType, SecondFailureActionType и ThirdFailureActionType, все принимающие то же перечисление значения - none, reboot, restart и runCommand.

Попробуйте, и если это сработает, это гораздо лучший выбор, чем обычное действие.

Ответ 2

Для WIX V 4.0, построив VS2015, выполните следующие действия:

1: Убедитесь, что на сборку WixUtilExtension.dll ссылается проект WIX.

2: добавьте http://wixtoolset.org/schemas/v4/wxs/util ns к корневому элементу Wix. Обратите внимание, что это правильный NS для WIX 4.0 (NOT 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>

Ответ 3

В Visual Studio, чтобы избежать использования -ext в CLI, вы можете сделать следующее:

Конечно, вы добавляете ресурс: <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

затем в Обозревателе решений → Ссылки → Добавить. WixUtilExtension.dll

После этого все работает как шарм. (wix 3.10)

Конечно, если вы используете второй ServiceConfig из utils. Как <util:ServiceConfig blablabla