2010-08-25 14 views
4

Je suis en train de développer une application qui utilise un ancien pilote USB. Pour une raison quelconque, les développeurs du pilote USB hérité ont décidé d'écrire des informations dans le registre et ce processus nécessite que j'aie des privilèges administratifs pour mon application.Demander à l'utilisateur de redémarrer l'application avec des privilèges d'administration tels que le débogueur VS

Maintenant, la fonctionnalité USB qui utilise le registre ne doit être effectuée qu'une fois par un utilisateur, ou lorsqu'il veut recalibrer son appareil, donc je n'ai pas besoin de privilèges administratifs tout le temps. Lorsque vous voulez déboguer une application qui nécessite des privilèges d'administration de Visual Studio, vous obtenez une fenêtre contextuelle avec une demande de redémarrage de l'application avec les informations d'identification correctes. Comment puis-je faire cela moi-même? Je veux démarrer mon application normalement, mais quand l'utilisateur va au menu d'étalonnage, je veux lui présenter une fenêtre contextuelle similaire en lui disant que pour cette option il doit redémarrer l'application avec des privilèges administratifs.

Répondre

3

Vous pouvez demander à un programme de démarrer avec des privilèges d'administrateur en utilisant le type ProcessStartInfo et en définissant la propriété Verb sur "runas".

var info = new ProcessStartInfo(); 
info.UseShellExecute = true; 
info.Verb = "runas"; 
// set the rest of the information 
Process.Start(info); 

Ceci invitera l'utilisateur à utiliser la boîte de dialogue Windows standard pour l'exécution du code administrateur.

+0

Merci. En combinant cela avec l'autre réponse, je peux faire ce que je veux. – Jensen

3

Visual Studio ne se redémarre pas en tant qu'administrateur, il détecte simplement s'il fonctionne en tant qu'administrateur et, si ce n'est pas le cas, affiche une boîte de message. Le test le plus simple pour vous serait d'appeler IsInRole - même lorsque vous êtes dans le groupe Administrateurs, si l'application est en cours d'exécution non élevée, elle renvoie false. Par exemple:

 WindowsIdentity wi = WindowsIdentity.GetCurrent(); 
     WindowsPrincipal wp = new WindowsPrincipal(wi); 

     if (wp.IsInRole("Administrators")) 
     { 
      MessageBox.Show("Yes, you are an Administrator.", "Is Administrator?", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
     else 
     { 
      MessageBox.Show("No, you are not an Administrator.", "Is Administrator?", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

Plutôt que ces boîtes de message, vous pouvez mettre votre propre à propos de "s'il vous plaît fermer et redémarrer moi". Ou si vous voulez montrer, donnez-leur un bouton à cliquer qui lancera une instance élevée (en utilisant ProcessStart et runas) et fermez celui-ci.

+2

Mieux vaut utiliser WindowsBuiltInRole.Administrator que la chaîne "Administrators". –

+0

@Helge - vous avez raison, merci! –