UAC - Correr siempre como administrador app C++

Iniciado por Kaxperday, 27 Diciembre 2015, 15:14 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Buenas, estoy creando un instalador para una aplicación que se va a correr siempre con privilegios de administrador, sino no tendría mucho sentido.

Para ello, pido permisos UAC en el primer momento y quiero que no se vuelvan a pedir más veces después de la primera.

Resulta que pensaba que con runas.exe se podía hacer, pero me he dado cuenta de que no tiene mucho que ver, antes en otros años quizás si se podía ahora no.

C:\Users\Usuario\Desktop>runas /savecred /user:Usuario "instalador.exe"

Me pide la contraseña y lo ejecuto, ya no me la vuelve a pedir más veces, OK pero no me aporta ningún privilegio de administrador, de hecho la aplicación no se ejecuta como tal a pesar de que he dicho que se ejecute como el usuario actual y he dado mi contraseña, vamos lo que hace es una ejecución normal de doble click, solo que te pide la contraseña porque permite pasar de un usuario a otro sin cerrar sesión, luego parece que no me interesa en absoluto runas.exe para la tarea.

Lo único que se me ocurre es lanzar el mensaje de UAC en runtime en bucle o algo así.

¿Alguna idea de como conseguirlo hacer? No me refiero solo a exploits... en plan me refiero a que a través de la contraseña del usuario y el usuario en sesión, alguna manera o comando para lanzarla como administrador, algunas ideas.

Saludos
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

#2
Cita de: Eternal Idol en 27 Diciembre 2015, 15:19 PM
Con el manifest:
https://msdn.microsoft.com/en-us/library/bb384608.aspx

¿Con el manifiesto?, no.. si la pongo un manifiesto para ejecutarse va a necesitar que el usuario haga doble clock y la eleve privilegios, de otra manera no funcionará, bien yo quiero que el usuario lo haga una vez si hace falta y las demás se hagan de manera automatizada.

Es decir, pongo manifiesto a mi aplicación -> la ejecutan -> funciona con privilegios. La anclo al registro, reinicio el ordenador y esa aplicación es incapaz de correr debido a que necesita volver a ser elevada por el usuario, por lo tanto no funcionaría.

Con el manifiesto deberíamos estar elevandola cada vez que quisieramos ejecutarla, y yo quiero que corra en segundo plano, y creo que hacerle al cliente elevarla cada vez que inicia sesión no es la mejor manera.

No funcionaría.

Saludos.

Edito: Hay 3 tipos de manifiesto el de "asinvoker", "biggestavailable", "requireadministrator".

Ahora me pregunto si la app sería capaz de correr con "biggestavailable" anclandola al registro y reiniciando el ordenador, si sería capaz de correr con permisos. No creo, con "requireadministrator" no funciona, pero por probar..

http://stackoverflow.com/questions/12651124/difference-between-highestavailable-and-requireadministrator-in-manifest-in

Me llevo una alegría, puede que biggestavailable pueda funcionar para lo que estoy buscando.

A ver que tal va la cosa:

C:\WINDOWS\system32>REG ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v pruebauac /t REG_SZ /d \"C:\Users\Usuario\Desktop\instalador.exe"
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

Crea un servicio entonces, es la manera de ejecutar en segundo plano en Windows, usa el manifesto en el instalador.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms685141%28v=vs.85%29.aspx
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

#4
Bueno tras reiniciar 2 veces (una para ver si funcionaba highesthavailable y otra para ver si funcioaba asinvoker), me he dado cuenta que ninguna de las 2 ha funcionado debido a que el anclado al registro ha debido de ser incorrecto, voy a probar a anclarlo a HKEY_LOCAL_MACHINE y eliminaré el registro anterior, a ver si así funciona.

Por lo que dices del registro, también lo había pensado desconozco si funcionará como quiero, creo que los servicios siempre corren como administrador (corregidme si me equivoco), que no requieren elevación, por lo tanto podría ser una salida... pero tengo que investigar mucho más acerca de ellos, voy a probar a reiniciar de nuevo, en unos minutos estaré editanto a ver si el highesthavailable es capaz de autoelevarse.

Parece que el de HKET_CURRENT_USER es para programas dentro de %appdata% ... que bien, por fin he eliminado el onedrive (le eliminé el anclado al registro :D).

Saludos.

Edito: wtf, he creado 2 claves en el registro para que se ejecutarán al reiniciar 2 programas de escritorio iguales uno con "asinvoker" y otro con "highestavailable" para ver si el segundo se elevaba... bueno tras solucionar un sencillo error he conseguido que los registros ejecutaran la aplicación de "asinvoker" pero la de "highestavailable" como imaginaba no fueron capaces de ejecutarla, a pesar de que pensaba que esta cuenta actuaba como la de admin.. funcionaría si fuese cuenta pura de admin que no debe de ser el caso.

En resumen, solo se ejecuta la aplicación con manifiesto "asinvoker", las que necesitan elevación de privilegios y tienen uac no se ejecutan tan fácilmente con un simple anclado al registro.

Por lo tanto parece que la única salida está en los servicios, ¿funcionarán?, ¿permitirán correr una aplicación como administrador sin necesidad de llamar al UAC?, ya lo veremos.

En mi siguiente aventura trataré de crear un servicio y correrlo siempre como administrador.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

PedroDJavier

No se si lo has resuelto pero es muy sencillo. Una vez que el usuario le da la primera vez acceso de admin, lo que tienes que hacer es que se añada al registro a HKEY_LOCAL_MACHINE -> Se ejecutara al inicio, en cualquier usuario, y como administrador.
Un saludo!

Kaxperday

#6
Cita de: PedroDJavier en 27 Diciembre 2015, 21:52 PM
No se si lo has resuelto pero es muy sencillo. Una vez que el usuario le da la primera vez acceso de admin, lo que tienes que hacer es que se añada al registro a HKEY_LOCAL_MACHINE -> Se ejecutara al inicio, en cualquier usuario, y como administrador.
Un saludo!

Lo he comprobado en reiteradas ocasiones y no se produce lo que dices, te invito a probarlo tu mismo, la aplicación que requiere elevación (UAC) no se ejecutará y la que no requiere se puede ejecutar sin problemas y de hecho lo hace.

Solo se puede ejecutar como admin si corres desde una cuenta de admin y el manifiesto que tiene es de "highestavailable", si es de "requireadministrator", no te librarás del UAC.

Es una pena que no se pueda, la verdad.

Saludos.

Se me ocurre una idea de crear un servicio que corra como localsystem, que inyecte una dll en un proceso, que esa dll obtenga el token del servicio que la ha invocado (no creo que se pueda, pero.. ¿y si si?) y que la dll corra como localsystem, tachan, no se si la DLL podría obtener el token del proceso a la que se inyecta, sería la osti* si este corriese como SYSTEM o admin.


Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.