9 de julio de 2011

Control UAC en Windows 7 / Vista

Como controlar el nivel de ejecución de nuestras aplicaciones bajo entornos Windows 7 / Vista. Y como podemos modificar este nivel con un archivo manifest (XML), previamente incrustado en nuestra aplicación.

En Windows XP los administradores no tienen ningún problema para ejecutar un instalador, modificar el registro, o crear carpetas en las areas protegidas por el sistema, pero en Windows 7, un administrador no tiene el acceso total.

Sin embargo, es posible establecer los privilegios de una aplicación desde su ensamblado para que ésta exija estos privilegios al sistema al ejecutarse, marcando privilegios en el manifiesto de la aplicación. Cuando se crea un nuevo proceso, el servicio de información de aplicaciones (AIS) inspecciona el manifiesto de la aplicación que está incrustado en los recursos de la aplicación. Esto prevalece sobre cualquier otro tipo de marcado de aplicaciones, incluido el marcado de compatibilidad de una aplicación o la detección del instalador de UAC (User Access Control). El manifiesto define un nivel de ejecución que indica a Windows los privilegios necesarios para ejecutar el archivo binario. El marcado del manifiesto de aplicación es relevante sólo para archivos EXE, no DLL, UAC no inspecciona archivos DLL durante la creación del proceso.

Las tres posibilidades de nivel de ejecución son:
  • asInvoker: la aplicacion obtiene los privilegios de aquel usuario o proceso que lo ejecutó (esta configuracion es la que se establece por defecto en cualquier proyecto nuevo).
  • highestAvailable: la aplicacion exije los privilegios mas altos posibles de acuerdo al usuario que ejecutó el programa.
  • requireAdministrator: establece que el proceso se debe crear con un token de usuario que sea miembro del grupo administradores. Si el usuario que intentó crear este proceso no es administrador, se mostrará un cuadro de diálogo para que proporcione sus credenciales.
Para ver los actuales privilegios que posee nuestra aplicación. Podemos acceder al archivo manifest que tiene incrustado nuestro aplicativo. La manera mas sencilla es a través del bloc de notas (NotePad.exe).
Con la ventana de comandos abierta ejecutamos lo siguiente:
Notepad   myapp.exe  
Una vez dentro pulsamos las teclas de búsqueda "Ctrl+B". Nos aparecerá la ventana de búsqueda de texto y tecleamos "assembly" (sin comillas), Pulsamos <Intro>. Y acto seguido nos localizará el archivo manifest que tiene nuestra aplicación incrustado. Tal y como se muestra en la siguiente figura.



Como se podrá comprobar, se "ve" perfectamente el archivo manifest que tiene incrustada nuestra aplicación. Con las funciones propias de copiar y pegar podemos extraer el contenido, y analizar el archivo.

<assemblyIdentity
  type="win32"
  name="myapp"
  version="1.0.0.0"
  processorArchitecture="*"/>
 <description>myapp - VFPX</description>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
   <requestedPrivileges>
    <requestedExecutionLevel
     level="AsInvoker"
     uiAccess="false"/>
   </requestedPrivileges>
  </security>
 </trustInfo>
 <dependency>
  <dependentAssembly>
   <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    publicKeyToken="6595b64144ccf1df"
    language="*"
    processorArchitecture="*"/>
  </dependentAssembly>
 </dependency>
</assembly>

Se puede ver en negrita el privilegio actual que posee nuestra aplicación.
Podemos cambiar el privilegio, por algunos de los tres modos mencionados anteriormente: asInvoker, highestAvailable, requireAdministrator.

Guardamos el archivo como un archivo de texto con el nombre de nuestra aplicación : myapp+exe+manifest. En el mismo directorio donde ya se ubica nuestro ejecutable.
myapp.exe.manifest
Ahora vamos a incluir el archivo manifest dentro de nuestro ejecutable. Para eso primero compilamos nuestro proyecto dentro del Fox y con una pequeña utilidad de Microsoft, incluida dentro del Windows SDK MT.EXE (http://msdn.microsoft.com/en-us/library/aa375649%28v=vs.85%29.aspx).

Incrustaremos nuestro archivo manifest. Siempre desde la línea de comandos. También se puede generar un archivo .BAT para que nos automatice todo el proceso. La instrucción quedaría de la siguiente manera.
MT -manifest  myapp.exe.manifest    -outputresource:myapp.exe;1
Así de sencillo y fácil se pueden incluir archivos manifest en nuestros ejecutables. Y con los privilegios que nos sean necesarios en cada situación. Yo por ejemplo utilizo un ejecutable para actualizar mis programas a través de Internet y por supuesto tiene los privilegios de Administrador (requireAdministrator). Así se pueden registrar OCX, acceder al registro del sistema etc. Etc.

Se puede descargar el MT.EXE desde aquí: http://dl.dropbox.com/u/10421838/mt.exe

Antonio L. Montagut ( www.ontarioxb.es )

Enlaces de Interés:
http://blogs.msdn.com/b/calvin_hsia/archive/2007/04/13/add-a-manifest-to-control-your-application-vista-uac-behavior.aspx
http://msdn.microsoft.com/en-us/library/aa375649%28v=vs.85%29.aspx
http://es.wikipedia.org/wiki/Control_de_cuentas_de_usuario
http://en.wikipedia.org/wiki/User_Account_Control

2 comentarios :

  1. Dame acceso al archivo mt me sale que no tengo permisos

    ResponderBorrar
  2. Muy buena información logre agregar el manifiesto al Exe y superado el UAC, (El MT.EXE lo pueden descargar desde github)
    https://github.com/eladkarako/mt


    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.