2012-09-18 22 views
13

he .wxs siguiente archivo:¿Cómo puedo configurar las opciones de recuperación de un servicio con WiX?

<?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> 

Antes de eso, lo he intentado:

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

que al parecer llamado sc.exe - pero nada cambió ...

Antes de que yo Lo he intentado:

<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> 

que no funciona, como th e MsiServiceConfigFailureActions table no funciona si se utiliza un instalador < 5,0, e incluso si se utiliza InstallerVersion="500" lo único que consigo es un error:

Serivce 'My Product' (My Product) could not be configured. This could be a problem with the package or your permissions. Verify that you have sufficient privileges to configure system services.

(y sí, ... He intentado también InstallPrivilges="elevated" - pero .. .el problema real es Action="restartService" según this)

Entonces ... usando un CustomAction es el camino a seguir (¿o no?).

he siguiente salida del registro

MSI (s) (34:28) [13:56:46:914]: Note: 1: 1722 2: ServiceRestarter 3: C:\Program Files (x86)\My Company\My Product\ 4: "C:\Windows\SysWOW64\sc.exe" failure "My Product" reset= 60 actions= restart/0
MSI (s) (34:28) [13:56:46:914]: Note: 1: 2205 2: 3: Error
MSI (s) (34:28) [13:56:46:914]: Note: 1: 2228 2: 3: Error 4: SELECT Message FROM Error WHERE Error = 1722
MSI (c) (2C:0C) [13:56:46:914]: Font created. Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg

Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor. Action ServiceRestarter, location: C:\Program Files (x86)\My Company\My Product\, command: "C:\Windows\SysWOW64\sc.exe" failure "My Product" reset= 60 actions= restart/0
MSI (s) (34:28) [13:56:48:849]: Note: 1: 2205 2: 3: Error
MSI (s) (34:28) [13:56:48:849]: Note: 1: 2228 2: 3: Error 4: SELECT Message FROM Error WHERE Error = 1709
MSI (s) (34:28) [13:56:48:849]: Product: My Product -- Error 1722. There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor. Action ServiceRestarter, location: C:\Program Files (x86)\My Company\My Product\, command: "C:\Windows\SysWOW64\sc.exe" failure "My Product" reset= 60 actions= restart/0

Action ended 13:56:48: ServiceRestarter. Return value 3.
Action ended 13:56:48: INSTALL. Return value 3.

¿Alguien puede ayudarme?

edición

He usado el viejo ServiceConfig -Ampliación:

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

que me da una acumulación de errores siguiente:

error CNDL0200: The ServiceInstall element contains an unhandled extension element 'util:ServiceConfig'. Please ensure that the extension for elements in the ' http://schemas.microsoft.com/wix/UtilExtension ' namespace has been provided.

Sé que puedo resolver este error al usar -ext WixUtilExtension a través de la línea de comandos, pero quiero usar Visual Studio para compilar ... Entonces, ¿cómo puedo adaptar t él construir-comando?

La única posibilidad es agregar una referencia a WixUtilExtension.dll a mi proyecto.

+0

@ david.barkhuizen en realidad, hay uno disponible: http://stackoverflow.com/questions/tagged/wix4 –

+0

@ david.barkhuizen mi pregunta está dirigida específicamente a 3.5/3.6, por lo que la introducción de la [etiqueta: wix4] sería incorrecto - esa es la razón por la que tu edición fue rechazada (o de lo contrario lo habría revertido) –

Respuesta

17

Veo que solo ha probado el elemento ServiceConfig, que viene con MSI 5.0. Sin embargo, hay another ServiceConfig element in UtilExtension, que ha estado allí durante mucho tiempo y parece que the thread you mention in your question confirms funciona.

El elemento util:ServiceConfig consta de 3 parámetros que desea utilizar: FirstFailureActionType, SecondFailureActionType y ThirdFailureActionType, todos acepte la misma enumeración de valores - none, reboot, restart y runCommand.

Pruébelo y, si funciona, es una opción mucho mejor que una acción personalizada.

+0

Pensé en eso, pero no funcionó con 3.6. ¿Me puede proporcionar un código de demostración de trabajo? –

+0

por favor vea mi edición! –

+3

Simplemente agregue 'xmlns: util =" http://schemas.microsoft.com/wix/UtilExtension "' al elemento raíz 'WiX' –

9

Para WIX V 4.0, edificio con VS2015, las siguientes obras:

1: Asegurarse de que el montaje WixUtilExtension.dll es referenciado por proyecto WIX.

2: Agregue http://wixtoolset.org/schemas/v4/wxs/util ns al elemento raíz Wix. Tenga en cuenta que este es el NS correcto para WIX 4.0 (NO http://schemas.microsoft.com/wix/UtilExtension como en versiones anteriores).

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

3: Asegúrese de que el elemento ServiceConfig tenga como prefijo la referencia correcta del espacio de nombres.

<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> 
+4

util: ServiceConfig también funciona con WIX versión 3.10.0.1503, utilizando xmlns: util = "http://schemas.microsoft.com/wix/UtilExtension" definición y la referencia .dll –

+1

La respuesta de @JaredDykstra no me funciona. pero eso me da una orientación. Encontré y trato con esto: ' 'y funciona. Mi versión de WIX es 3.10.0.2103. – gemr1423

+0

Tenga en cuenta que "RestartServiceDelayInSeconds" está en segundos, pero la IU de Windows muestra los minutos, por lo que si establece 30 segundos en este parámetro, cuando los vea a través de la IU de Windows, verá este parámetro establecido en 0 minutos. – Eccentropy

0

En Visual Studio, para evitar el uso -ext en CLI puede hacer lo siguiente:

Por supuesto, se agrega un recurso: <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

entonces, en el Explorador de soluciones -> Referencias - > Agregar ... WixUtilExtension.dll

Después de eso, todo funciona como un amuleto. (wix 3.10)

Por supuesto, si utiliza el segundo ServiceConfig de utils. Como <util:ServiceConfig blablabla

+0

Gracias por su aporte, pero ese enfoque ya ha sido sugerido en otros comentarios y respuestas :) –

Cuestiones relacionadas