web-dev-qa-db-fra.com

Exécutez ExeCommand dans customAction en tant que mode Administrateur dans Wix Installer

Je suis nouveau sur le programme d'installation de Wix. J'ai développé une configuration à l'aide du programme d'installation de wix pour mon application et j'ai besoin d'exécuter une action personnalisée pour exécuter une commande dans cmd.exe. Dans XP cela fonctionne bien. Mais dans Windows 8 et 7, l'invite cmd doit être exécutée en tant qu'administrateur.

J'ai googlé et trouvé les mots clés privilèges élevés et usurpation d'identité pourrait m'aider.

<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"   InstallPrivileges="elevated"></Package>

Comme vous pouvez le voir ci-dessus, j'ai utilisé l'attribut InstallScope défini sur perMachine et j'ai utilisé Impersonate = "No" dans l'élément CustomAction:

 <CustomAction Id='comReg' Directory='INSTALLLOCATION'  Impersonate='no'  
  ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]myProduct.dll"  /codebase' Return='check' />

Mais je n'ai reçu aucun changement lors de l'installation. J'ai besoin de l'invite de commande pour ouvrir et exécuter la commande ci-dessus en mode administrateur.

Et quelqu'un peut-il me parler de ces mots clés "Elevated Privileges & impersonate"

<InstallExecuteSequence>
  <Custom Action='comReg' After='InstallFinalize'>NOT REMOVE</Custom>
  <Custom Action='comUnreg' Before='RemoveFiles'>REMOVE</Custom>
</InstallExecuteSequence>

Comment faire?

21
Dah Sra

La documentation wix ici explique l'attribut Impersonate:

Cet attribut spécifie si Windows Installer, qui s'exécute en tant que LocalSystem, doit emprunter l'identité du contexte utilisateur de l'utilisateur qui installe lors de l'exécution de cette action personnalisée. En règle générale, la valeur doit être "oui", sauf lorsque l'action personnalisée nécessite des privilèges élevés pour appliquer les modifications à la machine.

Vous devez également comprendre la différence entre les actions personnalisées différées et immédiates. Voir l'attribut Execute sur la même page d'aide:

Cet attribut indique la planification de l'action personnalisée. La valeur de cet attribut doit être l'une des suivantes:

différé Indique que l'action personnalisée s'exécute dans le script (éventuellement avec des privilèges élevés). immédiat Indique que l'action personnalisée s'exécutera pendant le temps de traitement normal avec des privilèges utilisateur. C'est la valeur par défaut.

À l'heure actuelle, votre action personnalisée est immédiate, ce qui signifie qu'elle s'exécute avec des privilèges d'utilisateur. Voir cet article de blog pour beaucoup de détails, mais en particulier:

Toutes les actions personnalisées immédiates usurpent l'identité de l'utilisateur appelant . Avant Windows Vista, ce n'était pas un problème car à ce stade, l'utilisateur administratif installateur avait un jeton privilégié. Avec l'introduction de l'UAC dans Windows Vista, le jeton d'administration par défaut avec UAC activé est un jeton filtré et ne détient pas tous les privilèges. Étant donné que les actions personnalisées immédiates ne sont pas censées modifier l'état de la machine - uniquement pour recueillir des données d'état et planifier des actions personnalisées à exécuter différées - cela ne devrait toujours pas être un problème. Après tout, à ce stade, la génération des scripts d'installation et de restauration est tout ce qui devrait se passer.

Vous ne devez jamais modifier l'état de la machine avec une action personnalisée immédiate. Utilisez-en un différé et gardez l'emprunt d'identité pour non, et cela devrait fonctionner:

<CustomAction Id='comReg' Directory='INSTALLLOCATION' Execute='deferred' Impersonate='no' ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]EAWordImporter.dll" /codebase' Return='check' />

[~ # ~] éditez [~ # ~] : Planifiez l'action personnalisée à l'aide de l'élément InstallExecuteSequence:

<InstallExecuteSequence>
    <Custom Action='comReg' Before='InstallFinalize'/>
</InstallExecuteSequence>
36
tjleigh