C# – Programm automatisch mit Administratorrechten neu starten
Da ich es gerade mal wieder brauchte: Wie erreicht man, dass sich ein Programm selbst mit Administratorrechten neu startet?
Dazu zunächst eine kleine Abfrage, ob man bereits über entsprechende Berechtigungen verfügt (Zeile 1-2)
Dann setzt man den Pfad zur eigenen ausführbaren Datei zusammen (Zeile 5) //Hierfür gibt’s wahrscheinlich 100 verschiedene Möglichkeiten
Dann startet man sich selbst mit Adminrechten neu (Zeile 8)
Und beendet abschließend das bereits laufende Programm (Zeile 11)
WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); if (principal.IsInRole(WindowsBuiltInRole.Administrator) == false) { //Get the full qualified path to the own executable string x = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; //Start itself with adminrights if (RunElevated(x) == true) { //Close old programwindow this.Close(); } }
Der eigentlich Start mit Adminrechten ist dann (abgesehen vom UAC Fenster) ziemlich unspektakulär:
/// <summary> /// Run a program with elevated rights /// </summary> /// <param name="fileName">Path to the executable to run</param> /// <returns>True if no error has occurred</returns> private static bool RunElevated(string fileName) { ProcessStartInfo processInfo = new ProcessStartInfo(); processInfo.Verb = "runas"; processInfo.FileName = fileName; try { Process.Start(processInfo); return true; } catch (Win32Exception) { //Do nothing. Probably the user canceled the UAC window } return false; }
Done;
Gibts noch bessere Möglichkeiten? Ich bin für alles offen (und schiele mal so Richtung Sven, der es sich zum Hobby gemacht hat mich zu korrigieren 😉 )
Als Alternative: Man könnte auch ein app.manifest im Visual Studio anlegen, so dass die Anwendung sich nur mit Administratorrechten starten lässt. Erspart die Neustarterei und durch die UAC bekommt die Anwendung unter Vista und 7 auch gleich das entsprechende kleine Zusatz-Icon – man sieht also direkt, dass Adminrechte benötigt werden. Beim Starten kommt dann der Elevation-Dialog (falls die UAC nicht deaktiviert wurde).
Und ich finde die Zeile 2 im obigen Beispiel überflüssig, da Du den Variablenwert in der Condition gar nicht verwendest. Die Vergleiche auf „== true“ usw. sind Geschmacksache 🙂
Liebe Grüße,
Matthias
Der Meister hat gesprochen 🙂
Das hat man davon, wenn man den Code ohne nachzuprüfen aus ’nem alten Programm rauskopiert 🙂
Die Zeilen
bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);
bool continueInitialisation = false;
Waren nur zu Lern/Debugzwecken drin. Ich hab sie entfernt.
Das mit der Manifest Datei muss ich mir aber mal durchlesen.
Und warum bist du nie online wenn ich mal wieder wie Schwein vor Uhrwerk an irgendeinem Problem sitze?
Danke für die Lorbeeren 🙂 Etwas älterer Artikel zum Thema aber sehr übersichtlich: http://www.aneef.net/2009/06/29/request-uac-elevation-for-net-application-managed-code/
Und bin über Google Talk quasi immer online 😉
Alles klar mein Diggi. Jetzt see ich auch mal scharp. Yolo #C# forlifediggis
LOL Erster Kommentar meine BubblyBoys