it-swarm.com.de

Führen Sie den Prozess als Administrator von einer Nicht-Administrator-Anwendung aus

Von einer Anwendung, die nicht als Administrator ausgeführt wird, habe ich den folgenden Code:

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

Wenn ich Process.Start (proc) aufrufe, wird kein Popup angezeigt, in dem ich nach der Berechtigung zum Ausführen als Administrator gefragt werde, und die EXE-Datei wird nicht als Administrator ausgeführt.

Ich habe versucht, der bei myExePath gefundenen ausführbaren Datei ein app.manifest hinzuzufügen, und habe die angeforderte Ausführungsebene auf aktualisiert

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

Mit dem aktualisierten app.manifest wird beim Aufruf von Process.Start (proc) die Ausnahme "Der angeforderte Vorgang erfordert eine Erhöhung" angezeigt.

Warum legt die Aktion .Verb keine Administratorrechte fest?

Ich teste auf Windows Server 2008 R2 Standard.

29
jkh

Sie müssen verwenden ShellExecute. ShellExecute ist die einzige API, die es versteht, Consent.exe Zu starten, um zu erhöhen.

Beispiel (.NET) -Quellcode

In C # können Sie ShellExecute so aufrufen, dass Sie Process.Start Zusammen mit UseShellExecute = true Verwenden:

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);
}

Wenn Sie ein guter Entwickler sein möchten, können Sie feststellen, wenn der Benutzer auf Nein klickt:

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

Bonus Zuschauen

  • AC - Was. Wie. Warum. . Die Architektur der Benutzerkontensteuerung, in der erklärt wird, dass CreateProcess keine Erhöhung durchführen kann, erstellt nur einen Prozess. ShellExecute ist derjenige, der Consent.exe starten kann, und Consent.exe ist derjenige, der Gruppenrichtlinienoptionen überprüft.

Hinweis : Jeder Code, der als gemeinfrei veröffentlicht wird. Keine Zuordnung erforderlich.

50
Ian Boyd