2010-02-17 20 views
10

Bonne journée.Lancer l'application après l'installation terminée, avec UAC allumé

J'ai construit un installateur pour notre produit en utilisant la technologie WIX (Windows Installer XML). Le comportement attendu est que le produit est lancé, si la case à cocher est activée après l'installation.

Cela a fonctionné pendant un certain temps maintenant, mais nous avons récemment découvert que UAC de Win 7, et Vista est l'arrêt du lancement de l'application. J'ai fait quelques recherches et il m'a été suggéré que je devrais ajouter les attributs

Execute = 'différé' et Impersonate = 'non'.

Ce que j'ai fait, mais a ensuite découvert que pour exécuter différé, le CustomAction doit être effectuée, entre les phases InstallInitialize et IntallFinalize; ce qui n'est pas ce dont j'ai besoin. J'ai besoin du produit pour lancer AFTER installer finaliser, SI la case à cocher de lancement est cochée. Existe-t-il un autre moyen d'augmenter les autorisations?

Toutes les réponses, suggestions ou résonances seront appréciées.

Répondre

5

Malheureusement, le sujet que Rob a mentionné ne m'aide pas vraiment pour Windows Vista ou 7 comme je l'ai trouvé. Surtout avec l'UAC allumé.

La façon dont j'ai contourné ceci est d'utiliser un CustomAction qui lance l'invite de commande et lance l'application que vous voulez.

<CustomAction 
    Id="LaunchApp" 
    Directory="YourDirectory" 
    ExeCommand="[SystemFolder]cmd.exe /C app.exe" /> 

Espérons que ça aide.

Ray

2

Voir WiX and DTF: Using a bootstrapper to force elevated privileges in Vista comment vous pouvez exécuter l'ensemble élevé msi.

Vous pouvez l'automatiser dans le fichier .wixproj à l'aide de la tâche GenerateBootstrapper. Pour résumer:

Créer une setup.manifest comme ceci:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Setup" type="win32" /> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

et modifier votre fichier .wixproj comme ceci:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<!-- standard PropertyGroups and ItemGroups --> 

<PropertyGroup> 
    <WindowsSDK>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\[email protected])</WindowsSDK> 
</PropertyGroup> 
<PropertyGroup Condition="$(WindowsSDK) == ''"> 
    <WindowsSDK>$(registry:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\[email protected])</WindowsSDK> 
</PropertyGroup> 

<PropertyGroup> 
    <mt_exe>$(WindowsSDK)bin\mt.exe</mt_exe> 
</PropertyGroup> 

<ItemGroup> 
    <BootstrapperFile Include="Microsoft.Windows.Installer.3.1" > 
    <ProductName>Windows Installer 3.1</ProductName> 
    </BootstrapperFile> 
    <!-- more BootstrapperFile items --> 
</ItemGroup> 

<Target Name="Bootstrapper" 
     Inputs="$(OutDir)$(TargetFileName)" 
     Outputs="$(OutDir)\Setup.exe" 
     Condition=" '$(OutputType)'=='package' " > 
    <GenerateBootstrapper ApplicationName="application name" 
         ApplicationFile="$(TargetFileName)" 
         BootstrapperItems="@(BootstrapperFile)" 
         ComponentsLocation="Relative" 
         OutputPath="$(OutputPath)" 
         Culture="en-US" 
         Path="$(WindowsSDK)\Bootstrapper" /> 
</Target> 

<Target Name="PatchSetupExe" DependsOnTargets="Bootstrapper"> 
    <Exec Command='"$(mt_exe)" -manifest setup.manifest -outputresource:$(OutDir)\Setup.exe;#1' IgnoreExitCode='false' /> 
</Target> 

<Import Project="$(MSBuildExtensionsPath)\Microsoft\WiX\v3.0\Wix.targets" /> 

<PropertyGroup> 
    <BuildDependsOn>$(BuildDependsOn);Bootstrapper;PatchSetupExe</BuildDependsOn> 
</PropertyGroup> 
</Project> 

maintenant un setup.exe correct qui se déroulera élevé sera généré à chaque génération.