Tutorial: Insertar un manifest y ejecutar como administrador en vb6

Iniciado por okik, 10 Marzo 2015, 19:17 PM

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

okik

INSERTAR UN MANIFEST A NUESTRA APLICACIÓN Y EJECUTAR COMO ADMINISTRADOR EN VB6

Hola,
Seguro que hay más de un usuari@ de VB6 que le gustaría que su aplicación creada con VB6 tenga un aspecto actualizado con respecto a los nuevos SO de Microsoft. Además, poder cambiar el nivel de Control de cuentas de usuario de Windows, es decir que requiera iniciarse como "Administrador", de modo que permita acceder al registro y crear claves o modificar valores que requieren privilegios de Administrador.

Hace varios años busqué información en la Web y me costó encontrar un tutorial claro de como hacer simplemente que mi aplicación se ejecutara con nivel de Administrador. Encontré que podías añadir un archivo manifest, pero externo a la aplicación, con lo cual tu aplicación siempre tendría que ir acompañada de dicho archivo. El manifiesto, también permite habilitar los temas para los controles y cuadros de diálogo comunes del XP y posteriores.

Sin embargo, es posible introducir dicho manifiesto dentro de nuestra aplicación y que al iniciarse nuestra aplicación se aplique las instrucciones de dicho manifiesto. Visual Basic .Net ya lo hace de forma automática, y por supuesto es posible modificarlo dentro del entorno de programación.

Existen varios programas como ResourceHacker o PE Explorer que permiten introducir dentro de nuestra aplicación ya compilada, un manifiesto. Sin embargo, no es necesario ningún programa externo a VB6 para introducir un manifiesto en nuestra aplicación. A continuación explico como hacerlo con VB6 y Microsoft Visual C++ 6.0.

He hecho una explicación detallada. Realmente el proceso es muy sencillo, pero por escrito parece más complicado de lo que es realmente. Una vez se conoce el proceso se hace en un momento.

1. Crear un archivo de recursos con Microsoft Visual C++
Antes de nada hay que crear un archivo de recurso con el manifiesto y  compatible con VB6. Para ello iniciamos Microsoft Visual C++ 6.0 que, si lo tienes instalado, encontrarás el acceso directo en el menú inicio en la carpeta de "Microsoft Visual Studio 6.0". Si no lo tienes instalado, inicias el paquete de instalación de Visual Studio 6 y agregas Visual C++.

Bien, una vez iniciado Visual C++, en el menú "Insert" seleccionas "Resource..." o bien pulsa "Ctrl + R".



Del cuadro [Insert Resource] pulsa el botón [Custom]. Aparecerá otro cuadro con el nombre [New custom Resource] que te pide que introduzcas el [Resource Type]. Escribe "24" (sin comillas) y pulsa "OK".




Se creará un cuadro de texto de datos binarios de nombre "Script1-IDR_DEFAULT1 (24)", en el que más adelante, habrá que introducir el manifiesto.





Si esta ventana aparece maximizada, en el menú "Window" selecciona "Tile Horizontally" para poder visualizar el árbol de proyecto.





1.1 Cambiar el nombre del objeto de datos binarios
Haz clic en el árbol con el botón derecho del ratón sobre  "IDR_DEFAULT1" y selecciona propiedades.




Cambia el ID  por "1" (sin comillas) ya que por defecto es "IDR_DEFAULT1". Esto último es muy importante para que el manifiesto funcione. El nombre debe ser 1

Puedes también cambiar la opción "Language", yo pondría "Neutral" que es la primera opción de la lista.



De modo que el árbol queda así:



1.2 Cambiar le nivel de usuario
Llega el momento de introducir nuestro manifiesto, pero antes de hacerlo quizás quieras elegir el nivel de cuenta usuario para tu aplicación. Para ello, habrá que hacer una pequeña modificación en el manifiesto que se muestra más abajo.

Hay tres niveles de cuenta de usuario, a elección personal, para nuestra aplicación.

Fíjate en esta línea del manifiesto anterior:



Los tres niveles de cuenta son:

asInvoker

requireAdministrator

highestAvailable

Si quieres que tu aplicación se ejecute como Administrador cambia "asInvoker" por "requireAdministrator"



La línea quedaría así:

<requestedExecutionLevel level="requireAdministrator " uiAccess="false" />




Manifiesto:

Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly 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" manifestVersion="1.0">
 <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>

<!-- Opciones del manifiesto de Control de cuentas de usuario-->
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
       <requestedExecutionLevel level="asInvoker" uiAccess="false" />
     </requestedPrivileges>
   </security>
 </trustInfo>

<!-- Habilitar los temas para los controles-->
 <dependency>
   <dependentAssembly>
     <assemblyIdentity
         type="win32"
         name="Microsoft.Windows.Common-Controls"
         version="6.0.0.0"
         processorArchitecture="*"
         publicKeyToken="6595b64144ccf1df"
         language="*"
       />
   </dependentAssembly>
 </dependency>

<!-- Windows seleccionara automaticamente el entorno de mayor compatibilidad-->
     <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
       </compatibility>
</asmv1:assembly>


1.3 Escribir el manifiesto
En el cuadro de texto de datos binarios "1", hay que copiar y pegar el manifiesto mostrado arriba.



(Si habías cerrado el cuadro de textos binarios "1", haz doble clic sobre 1 en el árbol de proyecto para abrirlo de nuevo)

Al pegar el manifiesto el "documento" queda así:




MUY IMPORTANTE  :o
Es esencial para que funcione nuestro manifiesto, que la última línea quede en blanco. En la siguiente imagen puede verse que la última línea 0004f0 no está vacía. Si ocurre esto, nuestro manifiesto no funcionará:



La última línea debe estar vacía, para conseguirlo colocamos el cursor en el último punto (en la parte derecha, donde hay letras) y pulsa 'espacio' cuyo valor hexadecimal es 20, hasta que quede una última línea vacía:




Como puede verse en la imagen de arriba, ahora la última línea es 000500 y está vacía. Repito que esto es esencial  para que funcione el manifiesto en nuestra aplicación, de lo contrario la aplicación no se ejecutará.

1.4 Guardar y crear archivo RES
Después guardas como archivo RES.El cuadro "Guardar como" tiene tres opciones:

Resource Script (.rc)
Resource Template (.rt)
32-bit Resource File (.res)



Guardamos como "32-bit Resource File (.res)". Lo necesitarás para introducirlo en tu aplicación. Puedes elegir el nombre que te de la gana.

Mi consejo es que crees los tres tipos de manifiesto, y los guardes para otras aplicaciones. Pero ten en cuenta que cuando abras el proyecto VB6, éste buscará el archivo RES (archivo de recursos) que hayas vinculado al proyecto y que si en tu proyecto modificas el archivo RES añadiendo imágenes, cursores, iconos, archivos o tablas cadenas, luego, al guardar los cambios el archivo RES quedará modificado. Además, si ha sido movido o borrado cuando inicies el proyecto VB, el archivo RES, lógicamente no se cargará. Lo mejor, una vez creado el archivo RES, es hacer una copia del archivo en la carpeta de nuestro proyecto. Así, cada proyecto que hagamos tendrá su propio archivo RES.

2. Incrustar el manifiesto en la aplicación
Pues llega el momento de coger ese archivo RES que has creado y meterlo en tu aplicación. Para ello necesitamos una herramienta incluida en VB6 llamada "Editor de Recursos de VB6".

Abre tu proyecto de VB6 y ya dentro del entorno de programación ejecutas el Editor de Recursos de VB6. Es posible que no lo tengas habilitado. Para habilitarlo vas al menú "Complementos" y abres el "Administrador de complementos", aparecerá un cuadro con una lista de complementos. Selecciona "Visual Basic 6 Resource Editor" en la lista y marca como "visto"; cargado/Descargado y  Cargar al iniciar.

Bien,  una vez cargado "Visual Basic 6 Resource Editor" debería abrirse una ventana acoplable  y mostrarse un cubo verde en la barra de menú. Si no aparece la ventana del editor o la cierras sin querer, haz clic sobre el cubo verde. También se puede abrir desde el menú "Herramientas".




No encuentro el Editor de Recursos en VB6 :o
¿Cómo? ¿Que no encuentras "Visual Basic 6 Resource Editor"? Esto puede deberse a dos razones, que no has instalado los complementos de VB6 o que probablemente estés ejecutando Windows como invitado o usuario sin privilegios. Al instalarse VB6 se crean unas claves en el registro y ocurre que las claves relacionadas con los complementos y demás las crea en el registro del Administrador pero no en el registro de las cuentas sin privilegios. Por esta razón no aparecen los complementos. Al instalar VB6, Windows no crea estas claves a usuarios sin privilegios de Administrador.

Para solucionar el problema ejecuta VB6 como Administrador y si lo tienes instalado los complementos deberían aparecer en la lista. Hay un truco para poder usar los complementos en una cuenta sin privilegios de Administrador y es, que una vez instalado VB6 desde una cuenta de Administrador, acceder al registro de Windows y extraer todas las claves de VB6, para luego agregarlas, forzadamente, desde la cuenta sin privilegios. Concretamente la clave principal es (incluir las subclaves):

[HKEY_CURRENT_USER\Software\Microsoft\Visual Basic\6.0]

Y  la relacionada con el Editor de Recursos y sus valores es:

[HKEY_CURRENT_USER\Software\Microsoft\Visual Basic\6.0\Addins\ResEdit6.Connect]
"FriendlyName"="#2000"
"Description"="#2001"
"SatelliteDllName"="RsEdt"
"LoadBehavior"=dword:00000000
"CommandLineSafe"=dword:00000000

2.1  Abrir el manifiesto
La ventana del editor de recursos tiene una barra de menú, pulsa "Abrir" (la carpetita amarilla con flecha) o haces clic en la ventana con el botón secundario del ratón y seleccionas "Abrir". Y busca el archivo de recursos que creaste con Visual C++  de formato *.RES para cargarlo.




Al cargar el archivo de recursos con el manifiesto creado con Visual C++, el editor se muestra así:





2.2 Código necesario para el proyecto VB6
Tu proyecto ya tiene cargado un manifiesto. Pero hay un problema, puede que no te funcione en XP o cuando lo ejecutes en  Windows en "Safe Mode" (modo seguro).  Aún queda introducir el siguiente código en tu proyecto:

Código (vb) [Seleccionar]
Private Declare Sub InitCommonControls Lib "comctl32" ()

Private Sub Form_Initialize()
InitCommonControls
End Sub


Así se muestra un formulario VB6 sin el manifiesto.

Sin manifiesto:




Si todo se ha hecho correctamente tu aplicación debería mostrarse así una vez compilada:

Con manifiesto:

En Windows XP


Al ejecutar el programa en Windows XP, algunos controles se verán con un fondo de color negro. Para evitarlo, mete el control dentro de un PictureBox y entonces se verá correctamente.


En Windows Vista



En Windows 7



Y si as aplicado  "requireAdministrator", entonces al abrirla debería mostrar un cuadro de confirmación.


3. Introducir manifiesto en una aplicación ya creada con Microsoft Visual C++
Se pueden introducir manifiestos en aplicaciones ya creadas.

Ejecutas Visual C++ y abres cualquier aplicación como "Resource"




Puedes introducir el manifiesto como se ha explicado anteriormente o bien abres un archivo de recursos ya creado con el manifiesto y lo copias haciendo clic primero con el botón izquierdo sobre "1" o "24" para seleccionar y luego con el botón derecho del ratón y sin soltar arrastrar hacia el proyecto de la aplicación y copiar:












Ahora guardas y ya está hecho.