2012-07-20 11 views
20

He estado atascado en esto durante unas horas hasta que finalmente he logrado hacerlo. Ya hay enlaces que me apuntaban la dirección correcta:Cómo ejecutar la aplicación que requiere derechos de administrador de uno que no los tiene

Pero he pensado así de simple visión general del problema podría ayudar a alguien :).

+0

['LogonUser'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v = vs.85) .aspx) debería funcionar bien, creo. Menciona la creación de procesos directamente en la descripción. – chris

+0

.... ¿cuál es tu pregunta? –

+2

No es, es una solución para las personas que tienen los mismos problemas que yo. – Samuel

Respuesta

27

real problema: (de Wikipedia: http://en.wikipedia.org/wiki/User_Account_Control)

un ejecutable que está marcado como "requireAdministrator" en su manifiesto no se puede iniciar desde un proceso no elevada utilizando CreateProcess(). En su lugar, se devolverá ERROR_ELEVATION_REQUIRED. En su lugar, se deben usar ShellExecute() o ShellExecuteEx().

(Por cierto, ERROR_ELEVATION_REQUIRED error == 740)

Solución: (mismo sitio)

En una aplicación nativa de Win32 los mismos "runas" verbo se pueden agregar a un ShellExecute() o llamada ShellExecuteEx().

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

Esto puede ser también útil: (fuente: http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)

2 - Básico UAC flujo

Ok, así que antes de excavar en ella, pensé que podría ser útil para explicar el flujo básico de una aplicación consciente de UAC y cómo todo encaja. Normalmente, su aplicación se ejecuta como un usuario sin privilegios. Pero, a veces necesita ser un administrador (para hacer lo que sea). Por lo tanto, aquí está la idea básica, en pseudo código:

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; 

} 

Por último, esta es la forma en que lo he hecho:

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); 
} 

Y sólo por el bien de completitud - vínculos de MSDN a ShellExecute y 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

He utilizado este mismo enfoque en una de mis aplicaciones (generando una copia elevada de sí mismo a través de "runas" para realizar una sola tarea privilegiada, donde la línea de comando para el proceso hijo generado le dice qué tarea realizar), y aunque no es la forma en que Microsoft prefiere que las personas usen la elevación UAC, sí funciona en los casos en que un manifiesto de UAC en el .exe principal es excesivo. Microsoft prefiere que la tarea con privilegios esté en su propio .exe con un manifiesto de UAC en él, o en su propio objeto COM que se crea una instancia a través del moniker COM Elevation. –

+3

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

+1

Noté que la operación "runas" no se menciona entre las demás, en la documentación (de ShellExecute): incluso algunos usuarios de esa página discutieron si es seguro usarlo. El hecho de que funcione no es tan confiable (ya que tiene que verificarlo manualmente y en algunos casos puede no funcionar) como parte de la documentación que lo indica. ¿Hay alguien que tenga alguna referencia sobre la fiabilidad de los runas? – reallynice

Cuestiones relacionadas