c++ windows uac

c++ - Solicitar privilegios de administrador en tiempo de ejecución



windows uac (5)

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

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

¿Es posible ejecutar una aplicación C ++ 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 parece que no se puede encontrar en ningún lado si se puede hacer en tiempo de ejecución.

¡Gracias por tu ayuda!

EDITAR: ¿Qué sucede si quiero que la instancia actual tenga privilegios elevados? Por ejemplo, podría tener datos almacenados en la memoria que quiero conservar.


No del todo, pero puede hacer lo opuesto: puede eliminar los privilegios si ya los tiene. Por lo tanto, puede hacer que su programa comience a funcionar como administrador, utilizando uno de los métodos enumerados por Kate Gregory . Luego, descarta tus privilegios innecesarios; vea Dejar privilegios en C ++ en Windows para saber cómo hacerlo.


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 generalmente se ejecuta no elevada, debe crear otro .exe que solicitará la 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 la serie Windows Vista .


Si desea que la aplicación siempre se eleve, 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 ejecutable o el método abreviado y seleccione Ejecutar como administrador. Si lo está ejecutando desde el código, entonces como @vcsjones comenta, usa el verbo runas cuando inicia ese proceso. Por ejemplo:

ShellExecute( NULL, "runas", "c://windows//notepad.exe", " c://temp//report.txt", NULL, // default dir SW_SHOWNORMAL );


Su proceso (y subprocesos) tienen un token asignado a ellos. Ese token ya tiene todos tus grupos configurados. En UAC, el grupo Administrador está deshabilitado. UAC eliminará ese grupo deshabilitado para que finalice 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 SYSTEM, y Microsoft no proporciona uno, ni una API para controlar la implementación actual de UAC. De lo contrario, vencería el propósito.

En aras de la completitud, hay una lista blanca de procesos que puede realizar algunas operaciones elevadas sin preguntar. En resumen, tu ejecutable necesita:

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

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