User Account Control (UAC) es una tecnología de seguridad que Microsoft lanzó con Windows Vista y que está presente en Windows Server 2008 y Windows 7.
La mayoría corría su sistema operativo con una única cuenta, la de administrador, que no imponía restricción alguna. Esto dejaba al sistema operativo vulnerable ante el más mínimo ataque. También muchas aplicaciones no malintencionadas guardaban "información trivial" en el registro del sistema, que es una parte vital del mismo, como por ejemplo la posición de la ventana principal con respecto a la pantalla.
Con la llegada de Windows Vista, un primer lanzamiento de UAC y aplicaciones que aún no estaban adaptadas para correr bajo Windows Vista, los usuarios comenzaron rápidamente a molestarse porque por cada acción que querían realizar recibían una pantalla que pedía o aceptación para continuar o credenciales administrativas para así permitir a la aplicación ejecutar la acción que intentaba realizar.
Hoy en día una vez que nuestro sistema quedó configurado (es decir, con las aplicaciones que necesitamos para trabajar) serán pocas las veces que recibiremos notificaciones.
Por defecto todos los usuarios menos los invitados, que ingresan con menor cantidad de privilegios, ingresan como usuarios estándar. Cuando Windows ejecuta el escritorio todos los procesos hijos heredan de estos permisos estándar. Si ejecutamos una aplicación como administrador y a su vez esa aplicación ejecuta otra aplicación, la otra aplicación hereda los permisos de administrador.
Con esto Microsoft ha logrado dar una mejor protección a sus usuarios y de alguna manera mejorar indirectamente la calidad del software que se desarrolla para Windows. Aún así muchas personas prefieren deshabilitar UAC (no recomendado).
Compatibilidad con User Account Control (UAC)
Para logar compatibilidad con UAC es esencial entre otras cosas que:
- La funcionalidad de usuario y la funcionalidad administrativa corran en procesos separados.
- Todo ejecutable incluya en su archivo de manifiesto "requestedElevationLevel".
En Visual Studio 2008 para incluir un archivo de manifiesto que indique que nuestra aplicación está escrita con el objetivo de ser compatible con Windows Vista o superior hacemos lo siguiente:
1 – En el explorador de solución y sobre nuestro proyecto hacemos clic derecho y elegimos "Add" -> "New Item…".
[Haga clic en la imagen para ampliar]

2 – En el cuadro "Add New Item" buscamos y elegimos la plantilla "Application Manifest File".
[Haga clic en la imagen para ampliar]

3 – Si hacemos clic derecho sobre nuestro proyecto y elegimos "Properties", en la solapa "Application" veremos que bajo "Resources" Visual Studio detectó automáticamente que al compilar deberá incluir el archivo de manifiesto "app.manifest".
[Haga clic en la imagen para ampliar]
Configurando "app.manifest"
1 – Hacemos doble clic en el explorador de solución sobre "app.manifest". Aparecerá el editor. Veremos que por defecto el nivel de ejecución de nuestra aplicación será "asInvoker" ("<requestedExecutionLevel level="asInvoker" uiAccess="false" />"):
<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC Manifest Options If you want to change the Windows User Account Control level replace the requestedExecutionLevel node with one of the following. <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> If you want to utilize File and Registry Virtualization for backward compatibility then delete the requestedExecutionLevel node. --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </asmv1:assembly>
Las opciones disponibles son:
- "asInvoker": la aplicación correrá con los mismos privilegios que el proceso padre.
- "requireAdministrator": la aplicación correrá sólo para los administradores.
- "highestAvailable": la aplicación correrá con la mayor cantidad de privilegios que el usuario actual pueda obtener.
Podrán encontrar más información en:
The Windows Vista and Windows Server 2008 Developer Story: Windows Vista Application Development Requirements for User Account Control (UAC)
Windows Vista Application Development Requirements for User Account Control Compatibility
User Account Control Step-by-Step Guide
Understanding and Configuring User Account Control in Windows Vista
Inside Windows Vista User Account Control







