Установщик WIX сохраняет режим запуска для служб при крупном обновлении
Я пытаюсь создать установщик WiX, который для ряда служб (на данный момент 8) предлагает в CustomizeDlg возможность (функцию) для копирования и (если она включена) для установки службы на целевой машине. Одно большое требование заключается в том, что для всех "установленных" сервисов режим запуска (автоматический, ручной и т. Д.) Должен быть сохранен во время основного обновления. До сих пор я пытался расширить эти службы (exe), чтобы они принимали больше команд в командной строке. Две новые команды - "-preserve" и "-restore". Эти команды позволяют мне сохранять текущее состояние в пути реестра (не в разделе "УСЛУГИ") и восстанавливать его оттуда. Затем я добавил CustomAction в свой установщик, который использует эти команды. Это работает очень хорошо. Примите за один большой глюк:когда я (после установки) снова запускаю программу установки, она запоминает, какие службы (exe) были скопированы на машину, но не помнит, были ли установлены эти службы. Все они отмечают этот вариант знаком "X". Я умоляю головой об стену, но не могу найти решения. Конечно, я мог бы использовать ServiceInstall, но понятия не имею, как сохранить режим запуска. Кстати: остановка и запуск служб (например, до и после обновления) из соображений безопасности всегда выполняется вручную!Конечно, я мог бы использовать ServiceInstall, но понятия не имею, как сохранить режим запуска. Кстати: остановка и запуск служб (например, до и после обновления) из соображений безопасности всегда выполняется вручную!Конечно, я мог бы использовать ServiceInstall, но понятия не имею, как сохранить режим запуска. Кстати: остановка и запуск служб (например, до и после обновления) из соображений безопасности всегда выполняется вручную!
Вот урезанная "примерная версия" установщика:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="WiXDemoSetup" Language="1033" Version="1.0.0.0" Manufacturer="DemoCompany" UpgradeCode="455a350e-aa28-4f55-a0cf-62b3de9528da">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade Schedule="afterInstallInitialize" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<UIRef Id="WixUI_RBS" />
<Feature Id="ProductFeature" Title="WiXDemoSetup" Level="1" ConfigurableDirectory="INSTALLLOCATION" >
<ComponentGroupRef Id="ProductComponents" />
<Feature Id="ServiceA" Title="Install ServiceA" Level="1">
<ComponentRef Id='cmpServiceA' />
<Feature Id="ServiceA_Srvc" Title="Install ServiceA as Service" Level='3'>
</Feature>
</Feature>
<Feature Id="ServiceB" Title="Install ServiceB" Level='2'>
<ComponentRef Id='cmpServiceB' />
<Feature Id="ServiceB_Srvc" Title="Install ServiceB as Service" Level='3'>
</Feature>
</Feature>
</Feature>
<InstallExecuteSequence>
<Custom Action="cua_RollbkServiceA" Before="cua_InstalServiceA" ></Custom>
<Custom Action="cua_RollbkServiceB" Before="cua_InstalServiceB" ></Custom>
<Custom Action="cua_UninstServiceA" After="InstallInitialize">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
<Custom Action="cua_UninstServiceB" After="InstallInitialize">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
<Custom Action="cua_InstalServiceA" Before="InstallFinalize"><![CDATA[&ServiceA_Srvc=3]]></Custom>
<Custom Action="cua_InstalServiceB" Before="InstallFinalize"><![CDATA[&ServiceB_Srvc=3]]></Custom>
</InstallExecuteSequence>
<CustomAction Id="cua_RollbkServiceA" Directory="INSTALLLOCATION" ExeCommand=""[INSTALLLOCATION]ServiceA.exe" -remove" Execute="rollback" Return="ignore" Impersonate="no" />
<CustomAction Id="cua_RollbkServiceB" Directory="INSTALLLOCATION" ExeCommand=""[INSTALLLOCATION]ServiceB.exe" -remove" Execute="rollback" Return="ignore" Impersonate="no" />
<CustomAction Id="cua_UninstServiceA" Directory="INSTALLLOCATION" ExeCommand=""[INSTALLLOCATION]ServiceA.exe" -preserve -remove" Execute="deferred" Return="ignore" Impersonate="no" />
<CustomAction Id="cua_UninstServiceB" Directory="INSTALLLOCATION" ExeCommand=""[INSTALLLOCATION]ServiceB.exe" -preserve -remove" Execute="deferred" Return="ignore" Impersonate="no" />
<CustomAction Id="cua_InstalServiceA" Directory="INSTALLLOCATION" ExeCommand=""[INSTALLLOCATION]ServiceA.exe" -install -restore" Execute="deferred" Return="check" Impersonate="no" />
<CustomAction Id="cua_InstalServiceB" Directory="INSTALLLOCATION" ExeCommand=""[INSTALLLOCATION]ServiceB.exe" -install -restore" Execute="deferred" Return="check" Impersonate="no" />
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="INSTALLLOCATION" Name="WiXDemoSetup" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLLOCATION">
<Component Id="cmpFirstDll" Guid="{33CD4A77-C0F4-4BCC-A6D2-4D5C0CD84983}">
<File Id="filecmpFirstDll" KeyPath="yes" Source="$(var.SourceFolder)\PdfLib.dll" />
</Component>
</ComponentGroup>
</Fragment>
<Fragment>
<Component Id="cmpServiceA" Guid="{B299F42F-DA1E-44FA-AC9E-63CDDD103DAC}" Directory="INSTALLLOCATION">
<File Id="filecmpServiceA" KeyPath="yes" Source="$(var.SourceFolder)\ServiceA.exe" />
</Component>
</Fragment>
<Fragment>
<Component Id="cmpServiceB" Guid="{0CAFAC2F-3302-4D3E-95C1-6DC954247CE8}" Directory="INSTALLLOCATION">
<File Id="filecmpServiceB" KeyPath="yes" Source="$(var.SourceFolder)\ServiceB.exe" />
</Component>
</Fragment>
</Wix>