Solicitar privilegios de administrador en tiempo de ejecución


¿Es posible obtener una aplicación C++ ejecutándose en Windows para solicitar privilegios de administrador del sistema operativo en tiempo de ejecución?

Sé que se puede hacer en tiempo de compilación, pero no puedo encontrar en ninguna parte si se puede hacer en tiempo de ejecución.

Gracias por su ayuda!

EDIT: ¿Qué pasa si quiero que la instancia actual tenga privilegios elevados? Por ejemplo, es posible que tenga datos almacenados en la memoria que quiero mantener.

Author: JonaGik, 2011-06-21

5 answers

No del todo, pero puedes hacer lo contrario: puedes eliminar privilegios si ya los tienes. Por lo tanto, puede hacer que su programa comience a ejecutarse como Administrador, utilizando uno de los métodos enumerados por Kate Gregory. A continuación, elimine los privilegios innecesarios; consulte Eliminar privilegios en C++ en Windows para saber cómo hacerlo.

 8
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:39

Si desea que la aplicación eleve siempre, puede darle un manifiesto, ya sea compilando uno (no compilando técnicamente) o colocando un manifiesto externo en la misma carpeta que el exe. Si desea decidir, como persona, ejecutarlo elevado, haga clic con el botón derecho en el exe o atajo y elija Ejecutar como administrador. Si lo lanzas desde código, entonces como @ vcsjones comenta, usas el verbo runas cuando inicias ese proceso. Por ejemplo:

ShellExecute( NULL, 
    "runas",  
    "c:\\windows\\notepad.exe",  
    " c:\\temp\\report.txt",     
    NULL,                        // default dir 
    SW_SHOWNORMAL  
); 
 35
Author: Kate Gregory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-20 23:55:38

Puede elevar un proceso solo durante su creación. Cuando un proceso ya se ejecuta, no hay forma de cambiar su token de seguridad: se ejecuta elevado o no.

Si su aplicación necesita realizar una tarea administrativa, y normalmente se ejecuta sin niveles elevados, debe crear otra .exe que solicitará elevación con su manifiesto. Para iniciar un proceso elevado, debe usar la función ShellExecute o ShellExecuteEx. Desde su proceso principal necesitará una forma de pasar los comandos a ese nuevo proceso que se ejecutará elevado.


Para obtener más información sobre UAC, lea Diseño de aplicaciones UAC para Windows Vista series.

 8
Author: Alexey Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-21 06:17:27

Agregue un archivo de manifiesto en su EXE como se describe aquí.

Http://msdn.microsoft.com/en-us/library/bb756929.aspx

 2
Author: selbie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-21 03:53:48

Su proceso (y subprocesos) tienen un token asociado a ellos. Ese token ya tiene todos sus grupos configurados. En UAC, el grupo Administrador está deshabilitado. UAC eliminará ese grupo deshabilitado para que termine con un token de administrador completo.

Para lograr lo mismo, debe tener el privilegio TCB. En otras palabras, para elevar un proceso en tiempo de ejecución, necesitará ayuda de un proceso que se ejecuta bajo la cuenta del SISTEMA, y Microsoft no proporciona uno, ni una API para controlar el actual Implementación de UAC. De lo contrario, frustraría el propósito.

Para completar, hay una lista blanca de proceso que puede realizar algunas operaciones elevadas sin preguntar. En resumen, su ejecutable necesita:

  • Para ser firmado por Microsoft
  • Para realizar operaciones predefinidas, como con IFileOperation

La mejor explicación que encontré es este hack. Se ha arreglado desde entonces, pero arroja algo de luz sobre todo el asunto.

 2
Author: ixe013,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-21 04:36:22