Confidencial de WindowsA la espera de RunOnce

Raymond Chen

CONSIDERE UNA instalación que necesita reiniciar el sistema en el medio del proceso. Por ejemplo, es posible que el programa desee actualizar un archivo DLL del sistema que está en uso. Deberá activar un reinicio intermedio para poder instalar el nuevo archivo DLL y, a continuación, una vez que éste se haya actualizado, podrá usarlo en la próxima etapa de la instalación.

La clave RunOnce se diseñó para este tipo de situación; para que los programas de instalación la usen para finalizar su instalación tras un reinicio intermedio. (Esto era en la época en la que se confiaba en que los programas no producirían errores.)

El explorador de Windows® espera a que el programa RunOnce se ejecute hasta el final antes de crear el escritorio y la barra de tareas. Esto se debe a que RunOnce funciona bajo el principio de que está destinado a los programas de instalación. El programa RunOnce podría estar modificando los datos de configuración del sistema y no se desea que un usuario use el sistema durante la reconfiguración.

Por ejemplo, supongamos que el programa RunOnce está reorganizando y uniendo los archivos que acaba de instalar y algunos de ellos forman parte de la extensión de un shell. Evidentemente, no es deseable que el usuario intente ejecutar el programa o activar la extensión mientras que su archivo ejecutable se está actualizando.

Otra desventaja del principio "diseñado para programas de instalación" es que la clave RunOnce sólo se procesa si inicia sesión un usuario con privilegios de administrador. Por lo tanto, los usuarios que no son administradores no podrán finalizar la instalación. Además, si se ejecutase la clave RunOnce para usuarios que no sean administradores, ya no sería de tipo "ejecutar una vez" (run once). De hecho, crearía un importante problema. ¿Cómo podría decir "Bueno, esa ya la ejecuté, no hay que ejecutarla de nuevo"? Para cambiar este estado global del sistema, necesitaría privilegios de administrador. Y, evidentemente, el usuario que no sea administrador no dispone de dichos privilegios. El programa dejará de ser de tipo "ejecutar una vez". En cambio, será de tipo "ejecutar repetidamente hasta que inicie sesión el administrador".

  (Hacer clic en la imagen para ampliarla)

RunOnce, diseñado para finalizar la instalación del programa, es visible en la misma instalación de Windows. Cuando intente instalar un service pack o actualizar a una versión más reciente de Windows, el asistente para la instalación comprobará la clave RunOnce. Si no está vacía, recibirá un mensaje de error que indica que aún hay procesos del programa instalación en curso. Finalice dichos procesos antes de intentar actualizar el sistema operativo. Esto es lógico, ya que no sería deseable modificar el sistema operativo en el medio de la instalación de un programa.

Todo el diseño de RunOnce revela su pasado. Se concibió en Windows 95, un sistema operativo que no distinguía entre administradores y no administradores. Puesto que, en principio, todos los usuarios eran administradores en Windows 95, un programa de instalación que usaba RunOnce podía estar seguro de que las acciones RunOnce se realizaban tras el próximo reinicio.

En los sistemas operativos de Windows más recientes, y esto es particularmente cierto en Windows Vista™, es posible que ningún usuario con privilegios de administrador inicie sesión durante meses. Por consiguiente, un programa que requiere la ejecución de RunOnce podría tener una larga espera por delante.

Por otro lado, he observado un proceso de RunOnce perpetuo. Se volvía a agregar a sí mismo a la clave de RunOnce cada vez que se ejecutaba. Claramente, esto va en contra de la intención de la clave de RunOnce, puesto que ya no forma parte de la instalación del programa, sino del funcionamiento normal del programa. Además, este comportamiento hace que la instalación de Windows siempre informe de que hay una instalación en curso.

Por consiguiente, el usuario nunca puede actualizar el sistema operativo, ya que este programa persistente siempre indica que debe realizar una cosa más antes de finalizar. El programa no finalizará la instalación hoy, pero seguramente lo hará mañana. Es como estar a la espera de Godot, pero sin la crisis existencialista.

Raymond Chen, The Old New Thing, trata de la historia de Windows y la programación Win32. Actualmente trabaja en un libro, que casualmente también se titula The Old New Thing (Addison-Wesley, 2007).

© 2008 Microsoft Corporation and CMP Media, LLC. Reservados todos los derechos; queda prohibida la reproducción parcial o total sin previa autorización.