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
['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
.... ¿cuál es tu pregunta? –
No es, es una solución para las personas que tienen los mismos problemas que yo. – Samuel