Anfordern von Administratorrechten zur Laufzeit

Lesezeit: 6 Minuten

Benutzer-Avatar
JonaGik

Ist es möglich, eine C++-Anwendung unter Windows auszuführen, um zur Laufzeit Administratorrechte vom Betriebssystem anzufordern?

Ich weiß, dass es zur Kompilierzeit gemacht werden kann, aber ich kann anscheinend nirgendwo finden, ob es zur Laufzeit gemacht werden kann.

Danke für Ihre Hilfe!

BEARBEITEN: Was ist, wenn ich möchte, dass die aktuelle Instanz erhöhte Berechtigungen hat? Beispielsweise habe ich möglicherweise Daten im Speicher, die ich behalten möchte.

  • Mit können Sie einen weiteren Prozess starten runas Verb.

    – vcsjones

    20. Juni 2011 um 23:47 Uhr

  • Gemäß der Bearbeitung: Sieht so aus, als müssten Sie den Programmstatus serialisieren, damit Sie ihn wieder in den neuen Prozess einlesen können.

    – Markieren Sie Lösegeld

    21. Juni 2011 um 2:24 Uhr

  • Eine weitere Option – die App in einem speziellen Modus startbar machen, in dem sie lediglich als Mittel zum Ausführen von Aufgaben dient, die erhöhte Berechtigungen erfordern, IPC zum Kommunizieren der Daten verwenden – dies hat den netten Bonus, dass die App nicht neu gestartet wird (UI-Kontext wird beibehalten ) — und das UAC-Fenster zeigt den gleichen App-Namen (was eine vollständige Illusion von Privilegien gibt, die zur Laufzeit eskaliert werden :)) < /look-ma-we-tricked-Windows >

    – mlvljr

    9. November 2015 um 21:14 Uhr

  • Wie kann es zur Kompilierzeit gemacht werden?

    – MDXF

    2. März 2017 um 23:06 Uhr

  • @MDXF stackoverflow.com/a/19617989/1422096

    – Basj

    18. Juli 2017 um 13:35 Uhr

Wenn Sie möchten, dass die Anwendung immer erhöht wird, können Sie ihr ein Manifest geben, indem Sie entweder eines erstellen (nicht technisch kompilieren) oder indem Sie ein externes Manifest in denselben Ordner wie die EXE-Datei legen. Wenn Sie sich als Person entscheiden möchten, es mit erhöhten Rechten auszuführen, klicken Sie mit der rechten Maustaste auf die EXE-Datei oder die Verknüpfung und wählen Sie Als Administrator ausführen. Wenn Sie es aus Code starten, verwenden Sie als @vcsjones-Kommentare die runas Verb, wenn Sie diesen Prozess starten. Zum Beispiel:

ShellExecute( NULL, 
    "runas",  
    "c:\\windows\\notepad.exe",  
    " c:\\temp\\report.txt",     
    NULL,                        // default dir 
    SW_SHOWNORMAL  
); 

  • +1. Sie können die Runas verwenden, um als Administrator eine zweite Kopie der Anwendung zu erstellen und dann das Original selbst beenden zu lassen.

    – Ed Bayiates

    21. Juni 2011 um 0:33 Uhr


  • es funktioniert nicht für mich 🙁 Vielleicht ist es ein Problem mit der CPP-Version? Können Sie mir sagen, welches CPP Sie verwenden?

    – Strahl

    12. April 2014 um 11:55 Uhr

  • Ich kann bestätigen, dass dies so “nicht funktioniert”. ShellExecute gibt Null zurück, aber GetLastError() gibt 5 == ACCESS_DENIED. Bevor ich gehe und meine eigene Frage stelle, werde ich weiter nachforschen, aber ich dachte, Sie sollten es wissen …

    – jheriko

    14. Januar 2015 um 14:28 Uhr


  • (Eigentlich sind die Runas- und Administratorrechte ein Ablenkungsmanöver. Ich bekomme dieses Problem unabhängig davon, selbst wenn ich die aufrufende App als Administrator ausführe – also muss ich ein anderes Problem lösen, bevor ich diese Methode abschreibe.)

    – jheriko

    14. Januar 2015 um 14:53 Uhr

  • Die App eine zweite Kopie von sich selbst ausführen lassen mit ShellExecute/Ex(runas) hat bei mir immer gut funktioniert.

    – Rémy Lebeau

    13. Dezember 2018 um 20:02 Uhr

Sie können einen Prozess nur während seiner Erstellung erhöhen. Wenn ein Prozess bereits ausgeführt wird, gibt es keine Möglichkeit, sein Sicherheitstoken zu ändern: Er wird entweder mit erhöhten Rechten ausgeführt oder nicht.

Wenn Ihre Anwendung eine Verwaltungsaufgabe ausführen muss und normalerweise ohne erhöhte Rechte ausgeführt wird, müssen Sie eine weitere EXE-Datei erstellen, die mit ihrem Manifest die Erhöhung anfordert. Um einen erhöhten Prozess zu starten, müssen Sie verwenden ShellExecute oder ShellExecuteEx Funktion. Von Ihrem Hauptprozess aus benötigen Sie eine Möglichkeit, die Befehle an diesen neuen Prozess zu übergeben, der mit erhöhten Rechten ausgeführt wird.


Weitere Informationen zu UAC finden Sie unter Entwerfen von UAC-Anwendungen für Windows Vista Serie.

Benutzer-Avatar
Adam Rosenfield

Nicht ganz, aber Sie können das Gegenteil tun – Sie können tropfen Privilegien, wenn Sie sie bereits haben. Sie können Ihr Programm also als Administrator starten lassen, indem Sie eine der von Kate Gregory aufgelisteten Methoden verwenden. Lassen Sie dann Ihre nicht benötigten Privilegien fallen; Informationen dazu finden Sie unter Löschen von Berechtigungen in C++ unter Windows.

  • Gibt es eine Möglichkeit, die Berechtigungen zu löschen, damit der Benutzer keine UAC-Eingabeaufforderung erhält, wenn die Anwendung ausgeführt wird? (und fordern Sie die Berechtigungen später erneut an, an welcher Stelle der Benutzer eine UAC-Eingabeaufforderung erhalten würde)

    – JonaGik

    22. Juni 2011 um 4:57 Uhr

  • @JonaGik Um die UAC-Eingabeaufforderung zu vermeiden, beginnen Sie nicht mit erhöhter Ausführung. Starten Sie auf Anfrage eine andere App (partitionieren Sie Ihre App) oder starten Sie eine weitere Kopie derselben App mit erhöhten Rechten und schließen Sie die erste, erneut auf Anfrage.

    – Kate Gregory

    17. Januar 2013 um 21:34 Uhr

  • ich weiß es ist MÖGLICH, aber ich weiß nicht wie, um die privs zu erhöhen … Windows 7 Taskmanager (taskmgr.exe) kann es zur Laufzeit tun … intern wie? Ich weiß nicht. Öffnen Sie taskmgr.exe als Nicht-Administrator, gehen Sie dann zur Registerkarte Prozesse und drücken Sie die Schaltfläche „Prozesse von allen Benutzern anzeigen“, dann wird zur Laufzeit der Administratorzugriff angefordert.

    – Hansenrik

    12. Januar 2015 um 16:40 Uhr


  • @hanshenrik Ich weiß, es ist zu spät, aber jemand anderes könnte es nützlich finden: Der Task-Manager in Windows 7 wird zur Laufzeit nicht erhöht, weil dies unmöglich ist. Alles, was es tut, wenn Sie auf “Prozesse von allen Benutzern anzeigen” klicken, ist, dass es sich mit erhöhten Rechten neu startet. Wenn Sie die PID-Spalte im Task-Manager anzeigen, werden Sie taskmgr.exe PID ändert sich, nachdem es erhöht wird. Die Magie hier ist, dass Sie keine Erhöhungsanforderung für eine bekannte Anwendung von Microsoft sehen, sie wurde in Windows 7 implementiert, um die Anzahl der Erhöhungsanforderungen im Vergleich zu Windows Vista zu reduzieren.

    – Alexej Iwanow

    4. Juni 2015 um 13:58 Uhr

  • 🙂 Es klingt wie “Wir haben kein Toilettenpapier, aber wir haben Sandpapier auf Lager” – meine tiefste Entschuldigung, ich habe nicht die Absicht, jemanden zu beleidigen. Soweit ich weiß, ist das Ziel, UAC zu vermeiden, wenn wir können. Wenn wir UAC am Anfang aufrufen, verfehlt es den Zweck.

    – Andrei Kalantarian

    15. Oktober 2021 um 2:04 Uhr


Fügen Sie Ihrer EXE-Datei wie hier beschrieben eine Manifestdatei hinzu.

http://msdn.microsoft.com/en-us/library/bb756929.aspx

Ihrem Prozess (und Threads) ist ein Token zugewiesen. Mit diesem Token sind bereits alle Ihre Gruppen eingerichtet. Unter UAC ist die Administratorgruppe deaktiviert. UAC entfernt diese deaktivierte Gruppe, sodass Sie am Ende ein vollständiges Administrator-Token haben.

Um dasselbe zu erreichen, müssen Sie über das TCB-Privileg verfügen. Mit anderen Worten, um einen Prozess zur Laufzeit zu erhöhen, benötigen Sie Hilfe von einem Prozess, der unter dem SYSTEM-Konto ausgeführt wird, und Microsoft stellt weder einen noch eine API bereit, um die aktuelle UAC-Implementierung zu steuern. Andernfalls würde es den Zweck vereiteln.

Der Vollständigkeit halber gibt es eine Whitelist von Prozessen, die einige Vorgänge mit erhöhten Rechten ohne Aufforderung ausführen können. Kurz gesagt, Ihre ausführbaren Anforderungen:

  • Von Microsoft zu unterzeichnen
  • Zum Ausführen vordefinierter Operationen, wie mit IFileOperation

Die beste Erklärung, die ich gefunden habe, ist dieser Hack. Es wurde seitdem behoben, wirft aber etwas Licht auf die ganze Sache.

  • Sie können das einem Prozess zugewiesene Sicherheitstoken nicht sofort nach seiner Erstellung ändern.

    – Alexej Iwanow

    21. Juni 2011 um 5:55 Uhr

  • Sie können das einem Prozess zugewiesene Sicherheitstoken nicht sofort nach seiner Erstellung ändern.

    – Alexej Iwanow

    21. Juni 2011 um 5:55 Uhr

1013220cookie-checkAnfordern von Administratorrechten zur Laufzeit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy