Question

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 vers " 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 invite de commande avec privilèges 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 consulter ShellExecute pour cela?

Tout cela est sous Windows Vista. J'exécute le processus dans le débogueur VS2008 élevé au rang de privilège administrateur.

J'ai également essayé de définir startInfo.Verb = "runas"; , mais cela ne semblait pas résoudre le problème.

Était-ce utile?

La solution

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";

Cela entraînera Windows comme si le processus avait été démarré à partir de l'explorateur avec l'option "Exécuter en tant qu'administrateur". commande de menu.

Cela signifie que l'invite UAC s'affichera et que l'utilisateur devra en accuser réception. Si cela n'est pas souhaitable (par exemple, si cela se produit au milieu d'un long processus), vous devrez exécuter l'intégralité de processus hôte avec des autorisations élevées par Créer et incorporer un manifeste d'application (UAC) exiger le niveau d'exécution '' le plus élevé disponible ': cela provoquera l'apparition de l'invite du contrôle de compte d'utilisateur dès le démarrage de votre application, ainsi que l'exécution de tous les processus enfants avec des autorisations élevées, sans invite supplémentaire.

Modifier: je vois que vous venez de modifier votre question pour indiquer que " runas " n'a pas fonctionné 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.

Autres conseils

Ce code rassemble tous les éléments ci-dessus et redémarre l'application wpf actuelle 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 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 de manifeste d'application, modifiez le fichier de manière à ce que vous ayez défini requireAdministrator comme indiqué ci-dessus.

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

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 .

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

Cela se fera sans contrôle de compte d'utilisateur - pas 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.

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

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

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

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