Instaladores y el registro en Windows 7
Un efecto colateral de trabajar con una cuenta de usuario estándar en Windows 7 tiene que ver con la instalación de aplicaciones y su disponibilidad para otros usuarios diferentes del que instala.
El contexto es el siguiente: tengo una aplicación antigua, típicamente desarrollada en Visual Basic, que se instala mediante un MSI o un instalador tipo InstallShiled. La instalación se tiene que realizar con un administrador que no coincide con el usuario estándar con el que se trabaja día a día. Tras realizar la instalación y al intentar ejecutar la aplicación desde el perfil de nuestro usuario estándar, recibimos errores relacionados con componentes que no están correctamente registrados.
Arriba, errores por falta de un componente (Error 339).
Error 429… ActiveX cant’t create object. El error más típico de todos aquellos relacionados con problemas de automatización y componentes mal registrados o ausentes.
Diagnóstico
Utilizando Process Monitor , observamos problemas al intentar utilizar un componente ActiveX y no lo encuentra:
La misma ejecución utilizando el usuario con que se instaló demuestra que el componente si que se encuentra:
Tras monitorizar la instalación de la aplicación vemos que cuando se instala, el componente se registra en HKCU (current user), es por lo que sólo está disponible para ese usuario:
Solución
Como la instalación se basa en Windows Installer (MSI), podemos modificar el comportamiento de la por defecto haciendo que la aplicación esté disponible para todos los usuarios, para ello incluiremos la propiedad ALLUSERS=1 (instalar a nivel de máquina) al invocar el MSI.
1: C:\<path>\<mis_file>.msi ALLUSERS=1
Si estamos utilizando un instalador de InstallShield, podemos utilizar uno de los parámetros disponibles para pasarle propiedades a los MSI. La siguiente figura muestra las opciones de línea de comando de InstallShield:
Como podemos ver, el parámetro /v sirve para pasar los parámetros al MSI que invoque InstallShield. Importante, no hay que dejar espacio ni ningún separador entre el modificador “/v” y lo que queremos pasarle al MSI. Fijaros que para utilizar “silent mode”, se especifica “/S /v/qn" (/S –> ocultar el cuadro de dialogo de inicialización; /v/qn –> le pasa los parámetros /qn al msi, que significan “quiet mode” y “no user internface”). Por lo tanto, nuestro comando para invocar un setup.exe creado con InstallShield será como sigue.
1: C:\<path>\setup.exe /vALLUSERS=1
Resultado
Lo primero y más obvio es que la aplicación funciona cuando la utilizamos desde un usuario diferente.
Para ver lo que se cuece detrás del telón, ponemos una traza de Process Monitor y podemos ver qué hay diferente:
Ahora el registro del componente se está llevando a HKCR (Classes Root) lo que significa que el componente se está registrando a nivel de máquina. Eso es lo que conseguimos al utilizar ALLUSERS=1. Recordemos que HKCR, es una rama virtual que se compone los class ids que existan en HKLM + HKCU. Desde Windows Vista los usuarios estándar no pueden escribir en HKCR, solo los administradores, y eso es así puesto que en realidad lo que se hace es escribir en HKLM, en definitiva, a nivel de máquina.