2010-09-22 5 views
6

J'ai une application C# qui s'exécute et affiche une icône de plateau. J'ai un programme d'installation pour mon application de plateau qui lance l'application après l'installation. Le programme d'installation requiert des autorisations d'administrateur alors que l'icône de la barre d'état doit être exécutée avec les autorisations normales. Mon installateur casse actuellement ceci - quand l'application de plateau installée est lancée hérite des permissions d'admin du processus d'installation.Comment lancer le programme avec les autorisations de l'utilisateur au lieu des autorisations actives

Dans le cadre de mon programme d'installation, je lance une application C# pour effectuer certains travaux personnalisés. Cette petite application lance actuellement l'application de plateau en appelant:

Process.Start(@"path/to/my/tray/app.exe"); 

Est-il possible d'invoquer l'application de plateau avec les autorisations de l'utilisateur actuel plutôt que les autorisations élevées données à l'installateur?

J'ai entendu dire que la méthode recommandée pour ce faire est d'avoir un wrapper EXE autour du programme d'installation qui lance le programme d'installation puis lance le programme installé. Je voudrais éviter cela si possible. J'utilise WiX pour construire un programme d'installation MSI, donc j'accepte aussi des solutions qui fonctionnent directement à partir de WiX/MSI.

Répondre

0

Très bonne question. Les réponses que j'ai trouvées qui travaillent ostensiblement sont un peu brouillon; le plus élégant est le wrapper EXE.

Jetez un oeil à cet article: http://www.codeproject.com/KB/vista-security/RunNonElevated.aspx. Il décrit une méthode par laquelle vous pouvez obtenir un hook natif à l'une des fenêtres shell, qui s'exécutent sans élévation, et demandez au shell de démarrer votre code pour vous. Les hooks natifs en C# requièrent des permissions CAS très élevées; pour obtenir ces autorisations, votre programme d'installation doit être fortement nommé et signé, et le code doit exiger ou affirmer SecurityPermission avec SecurityPermissionFlag.UnmanagedCode.

La classe ProcessStartInfo du .NET Framework contient également une propriété UseShellExecute Boolean qui, lorsqu'elle est définie, indique à Process.Start() de donner cet appel au shell plutôt que de démarrer directement le processus à partir du domaine d'application actuel. Je ne sais pas si cela fera ce dont vous avez besoin, mais c'est certainement beaucoup plus facile à essayer; vous utilisez simplement la surcharge ProcessStartInfo de Process.Start(), avec un ProcessStartInfo déclaré ayant l'indicateur défini. N'oubliez pas que vous ne pouvez pas dire au shell de démarrer un EXE en tant qu'utilisateur autre que l'utilisateur actuellement connecté (UserName et Password ne doivent pas être définis sur ProcessStartInfo). Vous devez également spécifier le chemin d'accès au fichier EXE à l'aide de la propriété WorkingDirectory.

+0

UseShellExecute est apparemment par défaut à true, donc il semble que cela n'aidera pas, même si je n'ai pas encore essayé. Merci pour votre réponse mais je soupçonne que le wrapper exe sera la seule solution "soignée". – mchr

+0

J'ai maintenant testé cela et cela ne fonctionne pas. J'ai également essayé une DLL C++ en appelant http://msdn.microsoft.com/en-us/library/aa446583%28v=vs.85%29.aspx et en lançant en utilisant le nouveau jeton de sécurité. Cependant, cela ne peut pas modifier l'utilisateur qui possède le processus lancé - seules les autorisations dont dispose le processus lancé. – mchr

3

Il existe deux approches. Le plus simple est d'utiliser un shell exe qui lance d'abord la tâche admin (beaucoup de façons de le faire, je préfère un manifeste) et ensuite l'autre tâche non-élevée. Si vous refusez de le faire pour une raison quelconque alors jetez un oeil à l'article de blog et le projet CodePlex je lien à partir de mon blog à ce sujet: http://www.gregcons.com/KateBlog/NonElevatedFromElevatedManagedThisTime.aspx

1

Sinon, vous pouvez utiliser le Windows API CreateProcessAsUser, qui semble faire le travail.

+0

Cela a fonctionné pour moi comme un moyen d'exécuter une tâche planifiée en tant qu'utilisateur connecté à partir d'un service –

Questions connexes