2014-11-03 12 views
5

La mia applicazione non richiede sempre i privilegi di "admin" e la maggior parte delle volte verrebbe eseguita come utente corrente. C'è un modo, posso escalation dei privati ​​lanciando un UAC in runtime dopo che il mio programma è già in esecuzione? Questo accadrà solo quando e quando avrò bisogno di un privato. Piuttosto che dover iniziare con alti privilegi.Escalate Privilege in runtime (API Windows C/C++)

So che i "runas" tecnica, file manifesto ecc, ma tutti questi sono prima di creare il processo e non in fase di esecuzione, on-demand

risposta

9

Complimenti, questo è esattamente il modo UAC è progettato per funzionare, e qualcosa la maggior parte degli sviluppatori di applicazioni è o troppo pigra o troppo spaventata per contemplare l'aspetto :)

In poche parole, si inserisce il codice che richiede l'elevazione in un oggetto COM separato (che vive in una DLL) e quindi si crea un istanza elevata di esso utilizzando il metodo descritto here.

HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv) 
{ 
    BIND_OPTS3 bo; 
    WCHAR wszCLSID[50]; 
    WCHAR wszMonikerName[300]; 

    StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID)/sizeof(wszCLSID[0])); 
    HRESULT hr = StringCchPrintf(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]),\ 
     L"Elevation:Administrator!new:%s", wszCLSID); 
    if (FAILED(hr)) 
     return hr; 
    memset(&bo, 0, sizeof(bo)); 
    bo.cbStruct = sizeof(bo); 
    bo.hwnd = hwnd; 
    bo.dwClassContext = CLSCTX_LOCAL_SERVER; 
    return CoGetObject(wszMonikerName, &bo, riid, ppv); 
} 

La chiave è la Elevation:Administrator!new: prefisso al nome del moniker. Ciò causa l'attivazione della richiesta di elevazione e l'oggetto COM risultante verrà creato con un token elevato.

+0

Fantastico! Grazie! Proprio quello che stavo cercando! – MathOldTimer

Problemi correlati