PDA

Ver la Versión Completa : Ejecutar programa en el Inicio con Múltiples sesiones y/o servidor


gluglu
12-01-2013, 14:07:49
Hola !

De nuevo tengo que solicitar vuestra ayuda para ver cual sería la mejor solución a este asunto :

Necesito ejecutar un programa cuando se inicie una máquina. La máquina puede ser local, un servidor, una máquina virtual.

Hasta ahora, grababa una clave en el registro bajo HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run. Hasta aquí correcto, ya que cada vez que se reinicie el equipo se va a ejecutar el programa como es debido.

Cuando he empezado a utilizar múltiples conexiones de escritorio remoto a un servidor o servidor virtual, me doy cuenta que el inicio de sesión de cada una de esas conexiones remotas, me inicia también el programa, y consecuentemente (al necesitar una única instancia), da error con cada nuevo inicio de sesión de escritorio remoto.

Si pusiera la clave en el registro en vez de en HKLM en HKCU (HKEY_CURRENT_USER), entiendo entonces que en caso de reiniciarse la máquina, hasta que no se haga algún logín con nombre de usuario, no sería posible ejecutar ese programa para el usuario que haga el login. No me vale, porque además el programa se tiene que ejecutar independientemente del usuario que se conecte, y además iniciarse incluso sin que haga login ningún usuario.

Siguiente problema que se me plantea : En una máquina virtual, puede que no se conecte todavía ningún usuario, pero el programa se debe de ejecutar.

Además, si se termina una sesión de usuario, se cerrarán todos los programas iniciados por ese usuario, por lo tanto, ligar la ejecución del programa a un usuario creo que en ningún caso es válida.

Conclusión : Es mejor ejecutar el programa como un servicio de Windows (tendría además que investigar porque nunca lo he hecho) ? Si no lo hiciera como servicio, como asegurarme de que el programa se ejecute al iniciar la máquina y no se vuelva a ejecutar con cada nueva sesión de escritorio remoto ?

Gracias como siempre por vuestros comentarios.

gluglu
12-01-2013, 14:25:43
Añado algo más al asunto anteriormente expuesto :

La aplicación principal, que se inicia por cada usuario (incluidos los usuarios que utilizan escritorio remoto), hace un chequeo periódico para ver si el programa que se tiene que ejecutar al principio está activo o no. Si no lo estuviera, o estuviera 'colgado' (... cosas que pasan), comprueba si el programa está activo (en el caso de que esté colgado) en la máquina actual, manda un TaskKill (mediante TerminateProcess), y vuelve a ejecutar de nuevo el programa con un ShellExecute.

Cómo podría compaginar la comprobación y nuevo 'lanzamiento' si los usuarios son usuarios de escritorio remoto, es decir, como podría un usuario de escritorio remoto realizar un TaskKill del programa que se ejecutó al iniciar la máquina, y volver a relanzar el programa 'fuera' de esa sesión remota, en el 'hilo principal'.

nlsgarcia
12-01-2013, 21:53:30
gluglu,


Necesito ejecutar un programa cuando se inicie una máquina. La máquina puede ser local, un servidor, una máquina virtual.



grababa una clave en el registro bajo HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run. Hasta aquí correcto, ya que cada vez que se reinicie el equipo se va a ejecutar el programa



Cuando he empezado a utilizar múltiples conexiones de escritorio remoto a un servidor o servidor virtual, me doy cuenta que el inicio de sesión de cada una de esas conexiones remotas, me inicia también el programa, y consecuentemente (al necesitar una única instancia), da error con cada nuevo inicio de sesión de escritorio remoto.



En una máquina virtual, puede que no se conecte todavía ningún usuario, pero el programa se debe de ejecutar.



Conclusión : Es mejor ejecutar el programa como un servicio de Windows (tendría además que investigar porque nunca lo he hecho)

Revisa estos links:

Cómo desarrollar un servicio de Windows con Borland Delphi
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=484#.UPHBnfJWVIQ

Tutorial for making a Service Application using Delphi
http://delphi.about.com/gi/o.htm?zi=1/XJ&zTi=1&sdn=delphi&cdn=compute&tm=4&f=22&su=p284.13.342.ip_p504.6.342.ip_&tt=2&bt=1&bts=1&zu=http%3A//www.tolderlund.eu/delphi/service/service.htm

Creating a Windows Service in Delphi
http://delphi.about.com/gi/o.htm?zi=1/XJ&zTi=1&sdn=delphi&cdn=compute&tm=20&f=22&su=p284.13.342.ip_p504.6.342.ip_&tt=2&bt=1&bts=1&zu=http%3A//www.devarticles.com/c/a/Delphi-Kylix/Creating-a-Windows-Service-in-Delphi/

Si no lo hiciera como servicio, como asegurarme de que el programa se ejecute al iniciar la máquina y no se vuelva a ejecutar con cada nueva sesión de escritorio remoto ?

Revisa este link:

Evitar multiples instancias de nuestra aplicacion
http://www.clubdelphi.com/foros/showthread.php?t=80901&highlight=Evitar+multiples+instancias
Quizás te resulte interesante revisar este link como referencia:

Want to start your application at boot and run it 24x7 as a Windows Service?
http://www.coretechnologies.com/products/AlwaysUp/Intro.html?gclid=CPea8r_R47QCFQXNOgodNFcALw
Espero sea útil :)

Nelson.

gluglu
13-01-2013, 12:48:38
Gracias !! ... empezaré a revisar todos los links ! :rolleyes: