web-dev-qa-db-fra.com

Exécuter le processus en tant qu'administrateur à partir d'une application non administrateur

À partir d'une application qui n'est pas exécutée en tant qu'administrateur, j'ai le code suivant:

ProcessStartInfo proc = new ProcessStartInfo();
proc.WindowStyle = ProcessWindowStyle.Normal;
proc.FileName = myExePath;
proc.CreateNoWindow = false;
proc.UseShellExecute = false;
proc.Verb = "runas";

Lorsque j'appelle Process.Start (proc), je ne reçois pas de fenêtre contextuelle demandant la permission de s'exécuter en tant qu'administrateur et l'exe n'est pas exécuté en tant qu'administrateur.

J'ai essayé d'ajouter un app.manifest à l'exécutable trouvé sur myExePath, et j'ai mis à jour le requiredExecutionLevel en

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Avec le app.manifest mis à jour, sur l'appel Process.Start (proc), j'obtiens une exception: "L'opération demandée nécessite une élévation.

Pourquoi l'action .Verb ne définit-elle pas les privilèges d'administrateur?

Je teste sur Windows Server 2008 R2 Standard.

29
jkh

Vous doit utilisez ShellExecute. ShellExecute est la seule API qui sait lancer Consent.exe pour élever.

Exemple de code source (.NET)

En C #, la façon dont vous appelez ShellExecute consiste à utiliser Process.Start de même que UseShellExecute = true:

private void button1_Click(object sender, EventArgs e)
{
   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   Process.Start(info);
}

Si vous voulez être un bon développeur, vous pouvez attraper lorsque l'utilisateur a cliqué sur Non :

private void button1_Click(object sender, EventArgs e)
{
   const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.

   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   try
   {
      Process.Start(info);
   }
   catch (Win32Exception ex)
   {
      if (ex.NativeErrorCode == ERROR_CANCELLED)
         MessageBox.Show("Why you no select Yes?");
      else
         throw;
   }
}

Regarder les bonus

  • AC - Quoi. Comment. Pourquoi. . L'architecture de l'UAC, expliquant que CreateProcess ne peut pas faire d'élévation, crée uniquement un processus. ShellExecute est celui qui sait comment lancer Consent.exe, et Consent.exe est celui qui vérifie les options de stratégie de groupe.

Remarque : Tout code publié dans le domaine public. Aucune attribution requise.

50
Ian Boyd