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
[ '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
.... was ist deine Frage? –
Es ist nicht, es ist eine Lösung für Menschen, die in gleichen Schwierigkeiten wie ich – Samuel