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.

Componente no disponible

Componente no disponible

Arriba, errores por falta de un componente (Error 339).

Error 429... "ActiveX can't create object"

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:

image

La misma ejecución utilizando el usuario con que se instaló demuestra que el componente si que se encuentra:

image

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:

image

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:

image

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. Winking smile

Para ver lo que se cuece detrás del telón, ponemos una traza de Process Monitor y podemos ver qué hay diferente:

image

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.