2012-07-20 12 views
20

Ich bin seit ein paar Stunden darauf fest, bis ich es schließlich geschafft habe es zu tun. Es gibt bereits Links, die mir die richtige Richtung:Wie man eine Anwendung ausführt, die Administratorrechte benötigt, von einem, der sie nicht hat

Aber ich habe gedacht, dass einfache Überblick über das Problem jemand helfen könnte :).

+0

[ 'LogonUser'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v = VS.85) .aspx) sollte gut funktionieren, würde ich denken. Es erwähnt das Erstellen von Prozessen direkt in der Beschreibung. – chris

+0

.... was ist deine Frage? –

+2

Es ist nicht, es ist eine Lösung für Menschen, die in gleichen Schwierigkeiten wie ich – Samuel

Antwort

27

echtes Problem: (aus Wikipedia: http://en.wikipedia.org/wiki/User_Account_Control)

Eine ausführbaren Datei, die als "requireAdministrator" in seinem Manifest markiert ist, kann nicht von einem nicht erhöhten Prozess gestartet wird Createprocess() verwenden. Stattdessen wird ERROR_ELEVATION_REQUIRED zurückgegeben. ShellExecute() oder ShellExecuteEx() müssen stattdessen verwendet werden.

(BTW, ERROR_ELEVATION_REQUIRED Fehler == 740)

Lösung: (gleiche Seite)

In einer nativen Win32-Anwendung der gleiche "runas" Verb kann zu einer ShellExecute() hinzugefügt werden oder ShellExecuteEx() -Aufruf.

ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);

Dies kann auch hilfreich sein: (Quelle: http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)

2 - Grund UAC Fluss

Ok, also, bevor Sie in sie graben, dachte ich, es könnte hilfreich sein, um den grundlegenden Ablauf einer UAC-fähigen Anwendung zu erklären und wie alles zusammenpasst. Normalerweise wird Ihre Anwendung als nicht privilegierter Benutzer ausgeführt. Aber manchmal muss es ein Administrator sein (um etwas zu tun). So, hier ist die Grundidee, in Pseudo-Code:

int main (int argc, char **argv) { 

    HRESULT operation = tryToDoSomethingPrivileged(); 

    if (operation == ACCESS_DENIED && !alreadyElevated) { 

    // Spawn a copy of ourselves, via ShellExecuteEx(). 
    // The "runas" verb is important because that's what 
    // internally triggers Windows to open up a UAC prompt. 
    HANDLE child = ShellExecuteEx(argc, argv, "runas"); 

    if (child) { 
     // User accepted UAC prompt (gave permission). 
     // The unprivileged parent should wait for 
     // the privileged child to finish. 
     WaitForSingleObject(child, INFINITE); 
     CloseHandle(pid); 
    } 
    else { 
     // User rejected UAC prompt. 
     return FAILURE; 
    } 

    return SUCCESS; 

    } 

    return SUCCESS; 

} 

schließlich das ist, wie ich habe es getan:

if(0 == CreateProcess(argv[2], params, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) { 
     //runas word is a hack to require UAC elevation 
     ShellExecute(NULL, "runas", argv[2], params, NULL, SW_SHOWNORMAL); 
} 

Und nur für Vollständigkeit willen - MSDN Links zu ShellExecute und Createprocess :

http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx

+0

Ich habe den gleichen Ansatz in einer meiner Apps verwendet (eine erhöhte Kopie von sich selbst über "runas" erzeugt, um eine einzelne privilegierte Aufgabe auszuführen, wobei die Befehlszeile für den erzeugten Kindprozess angibt, welche Aufgabe ausgeführt werden soll) Es ist nicht so, dass Microsoft es vorzieht, Benutzer für die Verwendung von UAC-Anhebungen zu verwenden. In Fällen, in denen ein UAC-Manifest in der EXE-Hauptdatei übertrieben ist, funktioniert dies nicht. Microsoft bevorzugt die privilegierte Aufgabe in einer eigenen EXE-Datei mit einem UAC-Manifest oder in einem eigenen COM-Objekt, das über den COM-Elevation-Moniker instanziiert wird. –

+3

ShellExecuteEx nimmt ein Argument, einen Zeiger auf SHELLEXECUTEINFO. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v=vs.85).aspx –

+1

Ich bemerkte, dass die "runas" -Operation nicht unter den anderen, in der Dokumentation erwähnt wird (von ShellExecute): sogar einige Benutzer auf dieser Seite argumentierten, wenn es sicher ist, es zu benutzen. Die Tatsache, dass es funktioniert, ist nicht so zuverlässig (da Sie es manuell überprüfen müssen und in einigen Fällen möglicherweise nicht funktionieren), als eine Dokumentation, die es ausdrückt. Gibt es jemanden, der sich auf die Zuverlässigkeit von Runas bezieht? – reallynice

Verwandte Themen