web-dev-qa-db-fra.com

Élever le privilège de processus par programme?

J'essaie d'installer un service à l'aide de InstallUtil.exe mais appelé via Process.Start. Voici le code:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

m_strInstallUtil est le chemin complet et le fichier exe "InstallUtil.exe" et strExePath est le chemin/nom complet de mon service.

L'exécution de la syntaxe de ligne de commande à partir d'une commande élevée, l'invite fonctionne; en cours d'exécution à partir de mon application (à l'aide du code ci-dessus) ne fonctionne pas. Je suppose que je suis confronté à un problème d'élévation de processus. Comment puis-je gérer mon processus dans un état élevé? Dois-je regarder ShellExecute pour cela?

Ceci est tout sur Windows Vista. J'exécute le processus dans le débogueur VS2008 élevé au rang de privilège administrateur.

J'ai aussi essayé de régler startInfo.Verb = "runas"; Mais cela ne semblait pas résoudre le problème.

138
Scott Marlowe

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:

startInfo.Verb = "runas";

Windows se comportera alors comme si le processus avait été lancé à partir de l'explorateur avec la commande de menu "Exécuter en tant qu'administrateur".

Cela signifie que l'invite UAC apparaîtra et que l'utilisateur devra accuser réception: si cela n'est pas souhaitable (par exemple, si cela se produit au milieu d'un processus long), vous devrez exécuter l'intégralité de votre processus hôte avec autorisations élevées de créer et incorporer un manifeste d'application (UAC) pour imposer le niveau d'exécution '' le plus élevé possible ": le message d'invitation de l'UAC apparaît dès le démarrage de votre application et tous les processus enfants exécuter avec des autorisations élevées sans invite supplémentaire.

Edit: Je vois que vous venez de modifier votre question pour indiquer que "runas" ne fonctionnait pas pour vous. C'est vraiment étrange, comme il se doit (et le fait 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 néanmoins fonctionner.

168
mdb

Ce code rassemble tous les éléments ci-dessus et redémarre l'application actuelle wpf avec les privilèges d'administrateur:

if (IsAdministrator() == false)
{
    // Restart program and run as admin
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start(startInfo);
    Application.Current.Shutdown();
    return;
}

private static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)

Mise à jour: la manière manifeste de l'application est préférée:

Cliquez avec le bouton droit de la souris sur le projet dans Visual Studio, ajoutez-le, créez un nouveau fichier manifeste d'application, modifiez le fichier de manière à définir le paramètre requireAdministrator comme indiqué ci-dessus.

Un problème avec la méthode d'origine: si vous insérez le code de redémarrage dans app.xaml.cs OnStartup, la fenêtre principale peut toujours être lancée brièvement même si Shutdown a été appelé. Ma fenêtre principale a explosé si app.xaml.cs init n'était pas exécuté et que, dans certaines conditions de course, cela se ferait.

42
Curtis Yallop

Selon l'article Chris Corio: Apprenez à vos applications à bien jouer avec le contrôle de compte d'utilisateur Windows Vista, MSDN Magazine, janvier 2007 =, seul ShellExecute vérifie le manifeste incorporé et invite l’utilisateur à indiquer une élévation si nécessaire, contrairement à CreateProcess et d’autres API. J'espère que ça aide.

Voir aussi: même article que .chm .

21
Yevgeniy Shapiro
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

Cela se fera sans UAC - nul besoin de démarrer un nouveau processus. Si l'utilisateur en cours d'exécution est membre du groupe d'administration, comme dans mon cas.

7
hB0

Vous devez utiliser l'emprunt d'identité pour élever l'état.

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

N'oubliez pas de défaire le contexte imité lorsque vous avez terminé.

0
Vijesh VP