lunes, 5 de octubre de 2009

Añadir privilegios a una aplicacion en Windows Vista

En algunos casos, cuando desarrollamos software que necesita privilegios necesitamos modificar la configuracion de la UAC de windows vista, generalmente esto no es problema en Windows XP ya que los administradores no requieren de ninguna confirmacion para ejecutar un instalador, o modificar el registro, e inclusive para crear carpetas o modificarlas en las areas protegidas por el sistema, pero en windows vista, un administrador no tiene el acceso total a cualquier recurso, si no que en su lugar nos encontramos con una ventana de confirmacion, un prompt de la UAC de windows que de manera intrusiva se antepone a cualquier accion que representa un "riesgo" para el sistema, en mi opinion personal esta situacion simplemente funciona para dar la impresion de una supuesta seguridad en el sistema, pero en realidad existen maneras de saltar esta ventana de confirmacion, pero el proposito de este articulo, es establecer los privilegios de una aplicacion desde su ensamblado para que esta exija estos privilegios al sistema al ejecutarse, asi que dentro del ensamblado podemos tener 3 opciones para la configuracion de la UAC:

1. AsInvoker: Al tener esta entrada en el ensamblado, la aplicacion obtiene los privilegios de aquel usuario o proceso que lo ejecuto, esta configuracion es la que se establece por defecto en cualquier proyecto nuevo

2. HighestAvailable: Con esta entrada, la aplicacion exije los privilegios mas altos posibles de acuerdo al usuario que ejecuto el programa, si se ejecuta como un usuario administrador, la aplicacion nos hara la peticion mediante un prompt de UAC para ejecutarse con los privilegios mas altos

3.requireAdministrator: Esta declaracion en el manifiesto establece que la aplicacion requiere los privilegios de administrador del sistema para poder ejecutarse, este nivel de ejecucion tambien haria una solicitud de confirmacion para un usuario Administrador y un prompt de Runas para un usuario con una cuenta limitada, esto quiere decir que solicitaria las credenciales (usuario y password) del administrador del sistema

Para establecer esta configuracion lo primero es ir a la configuracion de nuestra aplicacion, en el explorador de soluciones hacemos doble click en "My project"



Esto abrira la configuracion de nuestra aplicacion, en la primera pestaña tenemos la configuracion de la UAC

Esto nos mostraria el manifiesto de ensamblado de nuestra aplicacion, que esta en formato XML y ahi hariamos la modificacion

requestedExecutionLevel level="asInvoker" uiAccess="false" requestedExecutionLevel level="requireAdministrator" uiAccess="false" requestedExecutionLevel level="highestAvailable" uiAccess="false"


Podemos ver que ahi se especifica con lineas comentadas las posibles opciones que podemos establecer para el requestedExecutionLevel y solo con cambiar el atributo level a "requireAdministrator" ya tendriamos establecida la configuracion de la UAC para solicitar privilegios.

Solo bastaria guardar los cambios, al compilar la aplicacion, el visual studio puede que requiera reiniciar.

En nuestra carpeta de release podemos ver que nuestra aplicacion ahora aparece con el clasico escudo de Windows vista para una aplicacion con privilegios


Listo!, ya tenemos una aplicacion que aunque depende de la confirmacion del usuario para ejecutarse ya podria realizar tareas administrativas evitando el error de UnauthorizedAccessException.



Hay que tomar en cuenta que, si estamos creando una aplicacion implementando ClickOnce no nos es posible modificar esta configuracion, ya que, como maneja diversos niveles de confianza añade otras entradas al ensamblado y el nivel de ejecucion debe ser "AsInvoker", ya que si lo cambiamos provocariamos un error de compilacion.


Tampoco se podria establecer esta configuracion en librerias dll ya que estas heredan los privilegios de la aplicacion que las contiene referenciadas.


Ejemplo realizado en Visual Studio 2008

No hay comentarios:

Publicar un comentario