Question

Nous avons une demande écrite en C ++ et .NET qui installe pour tous les utilisateurs dans le dossier Program Files. Cette application télécharge les nouvelles versions de lui-même (comme les installateurs MSI) et génère le nouveau processus d'installation pour remplacer lui-même.

Le processus d'installation tel qu'il existe aujourd'hui:

  1. Copier une application gestionnaire d'installation (C #, .NET 2.0) dans le répertoire temp. Appelez ce 'Manager'
  2. Manager est exécuté avec privs élevé par cet article .
  3. Les sorties de l'application originale.
  4. Gestionnaire génère le programme d'installation MSI (avec privs élevée, car la copie est élevée)
  5. Gestionnaire génère la nouvelle version de l'application.

Le bug:

L'application nouvellement installée est en cours d'exécution dans un état élevé. Cela pose des problèmes, je ne vais pas énumérer ici.

Idéalement, le lancement de l'application nouvellement installée serait exécuté avec les permissions de l'utilisateur d'origine.

Je ne peux pas comprendre comment rétrograder l'application de nouveau à être l'utilisateur standard après l'élévation.

Une bidouille inélégante:

(oui, oui, ce processus est peu élégant de toute façon)

  1. Copiez le gestionnaire installer dans le répertoire temp
  2. Exécuter le gestionnaire installer avec privs utilisateur standard. Appelons cette instance 'LowlyManager'.
  3. sortie de l'application originale.
  4. LowlyManager engendre l'application nouveau , cette fois avec des privs élevées. Soit le nom de cette instance 'UpperManagement'
  5. UpperManagement génère l'installateur
  6. UpperManagement sort avec élégance, retourner le code de sortie de l'installateur.
  7. LowlyManager interprète le code d'erreur de UpperManagement et engendre l'application nouvellement installée. Cette fois-ci l'invocateur d'origine.

Y at-il une meilleure façon de le faire?

(je l'ai laissé un tas d'autres détails avant et après ces étapes qui rendent le processus plus fluide pour l'utilisateur, mais cela devrait être suffisant pour comprendre le cœur du problème, je suis en train de résoudre.)

Autres exigences:

  • Nous ne pouvons pas installer comme une application par utilisateur
  • L'utilisateur ne doit pas être présenté avec une boîte de dialogue d'authentification si UAC aurait simplement demandé « êtes-vous sûr de vouloir autoriser cette action? ». Je pense que cela pourrait tuer une solution en utilisant WindowsImpersonationContext, mais je ne suis pas sûr.
  • Le système doit fonctionner sur XP, Vista et Windows 7 (même s'il y a un processus distinct pour XP).
Était-ce utile?

La solution

Aller simple: http://www.codeproject.com/KB/ vista-sécurité / VistaElevator.aspx

Une autre façon (mentionné dans la plupart des commentaires récents dans l'article précédent): http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part -2-faire /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top