2012-07-20 13 views
20

Sono rimasto bloccato su questo per alcune ore finché non sono finalmente riuscito a farlo. Ci sono già i link che mi ha indicato la direzione giusta:Come eseguire un'applicazione che richiede diritti di amministratore da uno che non li ha

ma ho pensato che semplice panoramica del problema potrebbe aiutare qualcuno :).

+0

['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

+0

.... qual è la tua domanda? –

+2

Non lo è, è una soluzione per le persone che si trovano nei miei stessi problemi di I. – Samuel

risposta

27

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

+0

Ho usato questo stesso approccio in una delle mie app (creando una copia elevata di se stesso tramite "runas" per eseguire una singola attività con privilegi, in cui la riga di comando per il processo figlio generato gli dice quale compito eseguire), e sebbene non è il modo in cui Microsoft preferisce che le persone usino l'elevazione UAC, funziona nei casi in cui un manifest UAC sul file .exe principale è eccessivo. Microsoft preferisce che l'attività con privilegi sia nel proprio .exe con un manifest UAC su di esso o nel proprio oggetto COM che viene creato un'istanza tramite il moniker di elevazione COM. –

+3

ShellExecuteEx accetta un argomento, un puntatore a SHELLEXECUTEINFO. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v=vs.85).aspx –

+1

Ho notato che l'operazione "runas" non è menzionata tra le altre, nella documentazione (di ShellExecute): anche alcuni utenti su quella pagina hanno discusso se è sicuro utilizzarlo. Il fatto che funzioni non è affidabile (dal momento che devi controllarlo a mano e in alcuni casi potrebbe non funzionare) come qualche pezzo di documentazione che lo dichiara. C'è qualcuno che ha qualche riferimento circa l'affidabilità delle rune? – reallynice

Problemi correlati