J'essaye d'installer un service utilisant InstallUtil.exe mais invoqué par Process.Start
. Voici le code:
ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);
où m_strInstallUtil
est le chemin d'accès complet et l'exe vers "InstallUtil.exe" et strExePath
est le chemin d'accès complet / nom à mon service.
L'exécution de la syntaxe de ligne de commande à partir d'une invite de commande élevée fonctionne; l'exécution à partir de mon application (en utilisant le code ci-dessus) ne fonctionne pas. Je suppose que je suis confronté à un problème d'élévation de processus, alors comment exécuter mon processus dans un état élevé? Dois-je regarder ShellExecute
pour cela?
Tout cela est sous Windows Vista. J'exécute le processus dans le débogueur VS2008 élevé au privilège d'administrateur.
J'ai également essayé le réglage startInfo.Verb = "runas";
mais cela ne semblait pas résoudre le problème.
la source
startInfo.UseShellExecute = true;
en plusstartInfo.Verb = "runas";
cela a bien fonctionné pour moi.Réponses:
Vous pouvez indiquer que le nouveau processus doit être démarré avec des autorisations élevées en définissant la propriété Verb de votre objet startInfo sur 'runas', comme suit:
Cela entraînera le comportement de Windows comme si le processus avait été démarré à partir de l'Explorateur avec la commande de menu "Exécuter en tant qu'administrateur".
Cela signifie que l'invite UAC apparaîtra et devra être reconnue par l'utilisateur: si cela n'est pas souhaitable (par exemple parce que cela se produirait au milieu d'un long processus), vous devrez exécuter l'ensemble de votre processus hôte avec autorisations élevées par Create and Embed an Application Manifest (UAC) pour exiger le niveau d'exécution `` le plus élevé disponible '': cela provoquera l'apparition de l'invite UAC dès le démarrage de votre application et l'exécution de tous les processus enfants avec des autorisations élevées sans invite supplémentaire .
Edit: Je vois que vous venez de modifier votre question pour déclarer que "runas" n'a pas fonctionné pour vous. C'est vraiment étrange, comme il se doit (et c'est le cas pour moi dans plusieurs applications de production). Exiger que le processus parent s'exécute avec des droits élevés en incorporant le manifeste devrait cependant fonctionner.
la source
startInfo.ShellExecute=true
pour que cela fonctionne ... aussi je n'ai pas pu faire fonctionner cette méthode avec des fichiers exécutables qui se trouvent sur un partage réseau (je dois les copier dans le répertoire temporaire local avant de l'exécuter). ..Ce code rassemble tout ce qui précède et redémarre l'application wpf actuelle avec les privilèges d'administrateur:
Mise à jour: la méthode du manifeste d'application est préférée:
Cliquez avec le bouton droit de la souris sur le projet dans Visual Studio, ajoutez un nouveau fichier manifeste d'application, modifiez le fichier afin que vous ayez défini requireAdministrator comme indiqué ci-dessus.
Un problème avec la méthode d'origine: si vous mettez le code de redémarrage dans app.xaml.cs OnStartup, il peut toujours démarrer brièvement la fenêtre principale même si Shutdown a été appelé. Ma fenêtre principale a explosé si app.xaml.cs init n'était pas exécuté et dans certaines conditions de course, il le ferait.
la source
string[] args
au processus réapparu.Selon l'article Chris Corio: Apprenez à vos applications à bien jouer avec le contrôle de compte d'utilisateur Windows Vista, MSDN Magazine, janvier 2007 , ne
ShellExecute
vérifie que le manifeste intégré et invite l'utilisateur à une élévation si nécessaire, tandisCreateProcess
que d'autres API ne le font pas. J'espère que ça aide.Voir aussi: même article que .chm .
la source
Cela le fera sans UAC - pas besoin de démarrer un nouveau processus. Si l'utilisateur en cours d'exécution est membre du groupe Admin comme pour mon cas.
la source
Vous devez utiliser l'emprunt d'identité pour élever l'état.
N'oubliez pas d'annuler le contexte imité lorsque vous avez terminé.
la source