2017-04-06 1 views
0

Donc j'essaye d'installer une application construite utilisant TopShelf, l'application elle-même fonctionne bien et n'a aucun problème. Le problème que je rencontre est quand j'essaye d'installer le service. Le service TopShelf est installé (à partir d'une ligne de commande d'administrateur) à l'aide de l'instruction myapp.exe install <options>. J'ai enveloppé l'instruction dans une action personnalisée (voir ci-dessous). Cela fonctionne, en ce que je peux voir une boîte noire pop-up sur l'installation. Le service ne parvient pas à installer, cependant. Lorsque j'exécute l'installation msi à partir d'une ligne de commande d'administrateur, le service s'installe correctement. J'ai inclus tous les paramètres relatifs à l'administrateur dans le fichier WiX (voir ci-dessous également). Je suis complètement à court d'idées et j'ai besoin d'aide. Quelqu'un peut-il voir quelque chose dans les fichiers WiX ou est-ce que quelqu'un a une idée de ce qui empêche l'installation du service?L'installation de TopShelf avec WiX échoue en raison des droits d'administrateur

Ce que j'ai essayé:

Topshelf - Custom Action in Wix Not Executing

Add Coffee and Shake Well - TopShelf

J'ai aussi essayé envelopper l'appel à l'application topshelf dans un projet d'action personnalisé WiX séparé pour exécuter et cela échoue également pour la même raison.

<Product Id="*" Name="PackageName" 
     Language="1033" 
     Version="1.0.0.0" 
     Manufacturer="Manufacturer" 
     UpgradeCode="e7780903-3cf9-4ecc-b65a-45bc18b500df"> 
    <Package InstallerVersion="200" 
      Compressed="yes" 
      InstallScope="perMachine" 
      InstallPrivileges="elevated" 
      Platform="x64" /> 

    <Property Id="MSIUSEREALADMINDETECTION" Value="1" /> 

    <MajorUpgrade AllowSameVersionUpgrades="yes" 
       DowngradeErrorMessage="A newer version of [ProductName] is already installed." 
       Schedule="afterInstallInitialize" /> 
    <MediaTemplate EmbedCab="yes"/> 

    <Feature Id="ProductFeature" Title="FeatureName" Level="1"> 
    <ComponentGroupRef Id="ProductComponents" /> 
    </Feature> 

    <CustomAction Id="InstallService" 
       FileKey="MyApp.exe" 
       ExeCommand="install" 
       Impersonate="yes" 
       Execute="immediate" /> 
    <CustomAction Id="StopService" 
       FileKey="MyApp.exe" 
       ExeCommand="stop" 
       Execute="immediate" /> 
    <CustomAction Id="UninstallService" 
       FileKey="MyApp.exe" 
       ExeCommand="uninstall" 
       Execute="immediate" /> 

    <InstallExecuteSequence> 
    <Custom Action="InstallService" After="InstallFinalize" > 
     NOT Installed AND NOT REMOVE 
    </Custom> 
    <Custom Action="StopService" After="InstallInitialize" > 
     (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") 
    </Custom> 
    <Custom Action="UninstallService" After="StopService"> 
     (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") 
    </Custom> 
    </InstallExecuteSequence> 
</Product> 

Répondre

1

Les actions personnalisées posent un certain nombre de problèmes. L'une est que l'AC InstallService est immédiate ce qui signifie 1) C'est avant que les fichiers sont installés et 2) il ne fonctionnera pas avec l'élévation. Il doit être différé et avant InstallFinalize.

S'il s'agit d'un service Windows ordinaire, vous devez utiliser un nœud ServiceInstall pour l'installer (et le désinstaller) ainsi que ServiceControl pour l'arrêter, le démarrer et le supprimer.

+0

Merci pour vos commentaires, doit essayer le changement de finaliser déferré quand je reçois un moment plus tard. L'écosystème de topshelf vaut le coup d'oeil, il termine l'arrêt et la configuration du service Windows, de sorte qu'un projet de service Windows puisse être exécuté depuis le débogage sans l'encapsuler comme application de console, et peut également l'installer depuis l'application principale. sans recompiler etc. Certainement la peine de regarder, mon explication n'a pas été grande! –

+0

Heres un lien vers celui-ci: http://topshelf-project.com –

+0

Brill, vous avez raison, en changeant l'AC pour avoir: 'Impersonate =" non "', 'Execute =" différé "' et mettre Execute 'Before = "InstallFinalize" 'merci pour votre aide! juste à comprendre la désinstallation maintenant! Je n'ai jamais eu autant de problèmes! –