problema reale: (da Wikipedia: http://en.wikipedia.org/wiki/User_Account_Control)
Un eseguibile che è contrassegnato come "requireAdministrator" nel suo manifesto non può essere avviato da un processo non elevati utilizzando CreateProcess(). Invece, verrà restituito ERROR_ELEVATION_REQUIRED. È necessario utilizzare ShellExecute() o ShellExecuteEx().
(BTW, ERROR_ELEVATION_REQUIRED errore == 740)
Soluzione: (stesso sito)
In un'applicazione nativa Win32 gli stessi "runas" verbo possono essere aggiunti ad uno ShellExecute() o chiamata ShellExecuteEx().
ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);
Questo può essere anche utile: (fonte: http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)
2 - base UAC flusso
Ok, quindi prima di scavare in esso, ho pensato che potrebbe essere utile per spiegare il flusso di base di un'applicazione con conoscenza del controllo dell'account utente e il modo in cui tutto combacia. Normalmente, l'applicazione viene eseguita come utente non privilegiato. Ma a volte ha bisogno di essere un amministratore (per fare qualsiasi cosa). Quindi, ecco l'idea di base, in pseudo-codice:
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;
}
Infine, questo è il modo ho fatto:
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);
}
E solo per amor di completezza - collegamenti MSDN a ShellExecute e 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) dovrebbe funzionare bene, penserei. Menziona la creazione di processi proprio nella descrizione. – chris
.... qual è la tua domanda? –
Non lo è, è una soluzione per le persone che si trovano nei miei stessi problemi di I. – Samuel