Para que tu aplicación pueda pasar algunos de los casos de prueba alrededor de seguridad para Windows Vista, tiene que ser compatible con el User Account Control.
¿Qué es el User Account Control (UAC)?
A muy grandes rasgos, es un mecanismo dentro de Windows Vista que refuerza la seguridad del escritorio haciendo que todos los usuarios por omisión corran con una cuenta con pocos privilegios (Least Priviledged User Account). Este mecanismo separa todos los procesos que requieren privilegios mediante tokens y cuando se requiere hacer un movimiento que requiere elevación de privilegios, se pedirá el consentimiento explicito del usuario mediante un diálogo del UAC que detiene la operación de la computadora.
Recuerden que por defecto, todos los usuarios dentro de Windows Vista con el UAC habilitado estarán corriendo como standard user (LUA).
Para hacer nuestra aplicación compatible con UAC le tenemos que decir explicitamente al sistema operativo que tipo de privilegios requiere para correr. La manera de decirle esto al sistema operativo es añadiendo un manifiesto dentro del ejecutable con un tag que le indica cual es el nivel requerido de ejecución (requestedExecutionLevel).
Incrustando Manifiestos
Un manifiesto es un archivo XML que define varios tags. Existen varias maneras de como incrustar manifiestos en nuestros aplicativos, siendo la más común usando MT.EXE (manifest tool) que se distribuye en el SDK de Windows Server 2003.
Para incrustar manifiestos dentro de una aplicación en C/C++ solo lo añades al resource y recompilas completo. Para añadir manifiestos dentro de VS7 tienes que crear un archivo con el mismo nombre del ejecutable con extensión .manifest y recompilar completo.
Un ejemplo de un manifiesto es el siguiente:
<?xml version=»1.0″ encoding=»UTF-8″ standalone=»yes»?>
<assembly xmlns=»urn:schemas-microsoft-com:asm.v1″ manifestVersion=»1.0″>
<trustInfo xmlns=»urn:schemas-microsoft-com:asm.v3″>
<security>
<requestedPrivileges>
<requestedExecutionLevel level=»requireAdministrator» uiAccess=»true»/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Como podemos observar tiene un tag nuevo que se denomina requestedExecutionLevel. Este tag es una extensión al esquema de manifiestos que tenemos actualmente y básicamente pueden ser tres valores:
- asInvoker. Corre el programa con el mismo token que el usuario firmado.
- highestAvailable. Corre el programa con el token más alto que esta disponible para el usuario firmado.
- requiresAdministrator. Requiere elevación de privilegios.
UAC en Acción
Cuando requerimos elevación de privilegios el diálogo de consentimiento de UAC va a salir. Siempre. No hay manera de saltarlo excepto cuando:
- Estas corriendo dentro de un proceso con privilegios elevados. Por ejemplo si corres el Command Prompt como administrador (obtienes el UAC cuando ejecutas el CMD) y después dentro del CMD ejecutas el nombre de un ejecutable que requiere administrador el diálogo de UAC no aparece por que ya estas corriendo dentro de un thread de proceso elevado y el token será compartido.
- Cuando el UAC está deshabilitado.
Si tu aplicación no contiene un manifiesto y requiere privilegios elevados, tendrás que usar siempre Run As… dentro de Windows Vista.
Todas las aplicaciones en Windows Vista 32 y 64 deberán tener un manifiesto incrustado definiendo el nivel de ejecución y este deberá ser asInvoker, permitiendo que corra con los menos privilegios posibles. Si este manifiesto no se encuentra dentro del ejecutable tu aplicación no podrá ser certificada con el Logo, a menos que Microsoft te dé chance por escrito.
Más información sobre UAC:
Cheers!
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.