usuario tengo soy puedo programa permisos limitado ejecutar dar como app administrador c++ winapi uac shellexecute createprocess

c++ - tengo - Cómo ejecutar una aplicación que requiere derechos de administrador de uno que no los tiene



no puedo ejecutar como administrador windows 10 (1)

He estado atrapado en esto por algunas horas hasta que finalmente logré hacerlo. Ya hay enlaces que me indicaron la dirección correcta:

Pero he pensado que una simple descripción del problema podría ayudar a alguien :).


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

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

(Por cierto, ERROR_ELEVATION_REQUIRED error == 740)

Solución: (mismo sitio)

En una aplicación Win32 nativa, el mismo verbo "runas" se puede agregar a una llamada ShellExecute () o ShellExecuteEx ().

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

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

2 - Flujo básico de UAC

De acuerdo, antes de profundizar en él, pensé que podría ser útil explicar el flujo básico de una aplicación compatible con UAC y cómo todo encaja. Normalmente, su aplicación se ejecuta como un usuario sin privilegios. Pero, a veces tiene que ser un administrador (para hacer lo que sea). Entonces, 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; }

Finalmente, así es como 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 solo para completar: MSDN enlaza con 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