Как установить параметры восстановления службы 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=""[SystemFolder]sc.exe" failure "$(var.ProductName)" 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
к моему проекту.
Ответы
Ответ 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