Crear e instalar un Servicio Windows paso a paso
22 agosto, 2007 26 comentarios
Hola a tod@s,
En el siguiente artículo voy a explicar como hacer un ejemplo muy sencillo de servicio Windows, como crear un setup de instalación y como poner en marcha dicho servicio. El ejemplo lo voy a hacer en C# framework 2.0 y lo que va a hacer es que cada 10 segundos escriba en un fichero de texto la fecha actual y el intervalo usado en milisegundos.
1. Creamos un nuevo proyecto de tipo Servicio de Windows. Le podemos llamar como queramos en mi caso WindowsService1
2. Nos vamos a las propiedades de la clase Service1.cs y ponemos a true "CanPauseAndContinue" y "CanShutdown" que por defecto son false. Como su propio nombre indican, nos permiten pausar, parar y reiniciar el servicio.
3. Ahora nos vamos a la parte de código de Service1.cs y ponemos el siguiente código:
- Agregamos los siguientes espacios de nombres:
using System.Timers;
using System.IO;
- En el constructor agregamos las siguientes líneas debajo de InitializeComponent:
t = new Timer(10000);
t.Elapsed +=new ElapsedEventHandler(t_Elapsed);
- Declaramos el Timer t dentro de la clase:
private Timer t = null;
- Agregamos el siguiente código en el método OnStart:
t.Start(); //Iniciamos el timer
- Agregamos el siguiente código en el método OnStop;
t.Stop(); //Paramos el timer
- Ahora creamos el evento que maneja el evento Elapsed del Timer:
void t_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
string path = @"C:\log.txt";
TextWriter tw = new StreamWriter(path, true);
tw.WriteLine("A fecha de : " + DateTime.Now.ToString() + ", Intervalo: " + t.Interval.ToString());
tw.Close();
}
catch(Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("Application", "Exception: " + ex.Message);
}
}
4. Añadimos un instalador al proyecto. Botón derecho sobre el proyecto en la ventana de Explorador de Soluciones, añadir nuevo Item.
5. Ahora nos vamos a la barra de herramientas y agregamos sobre el elemento anterior un ServiceInstaller y un ServiceProcessInstaller. Hay que tener en cuenta que por defecto no vienen en la barra de herramientas, pero los podéis añadir con botón derecho sobre la barra de herramientas "Choose Items…", con ésta acción se nos mostrará un listado de todas las herramientas que podemos usar. Para nuestro ejemplo ordenamos por Namespace y buscamos System.ServiceProcess y agregamos a la toolbox éstos elementos. Y luego los añadimos al Installer que hemos agregado al proyecto.
6. Configuramos las propiedades de los 2 elementos que hemos añadido en el paso 5 de la siguiente manera:
- Para el elemento ServiceInstaller
- StarType Automatic
- Description "Ejemplo de Servicio de Windows"
- DisplayName "Servicio que crea y escribe fichero"
- ServiceName "Mi Servicio"
- Account LocalSystem (No se recomienda este tipo de permiso, pero al tener que escribir un fichero de texto, de esta manera no habrá problemas, para el modo mas seguro sería crearse una cuenta de usuario con los mínimos privilegios posibles)
- Parent Installer1 (cuidado con esta propiedad porque se puede desconfigurar y producir errores)
7. Generamos el proyecto.
8. Agregamos a la solución un proyecto de setup. Fichero/Añadir/Nuevo Proyecto
9. Con botón derecho sobre el proyecto de setup en la ventana de explorador de soluciones, añadimos "Project Output", en project nos aseguramos de tener nuestro proyecto de servicio de Windows, y estar seleccionada "Primary output"
10. Con botón derecho sobre el proyecto de setup en la ventana de explorador de soluciones, View / Custom Actions.
11. Ahora en "Custom Actions" con botón derecho "Add Custom Actions…", Seleccionamos "Application Folder" y luego "Primary output from WindowsService1 (Active)"
12. Muy importante es cambiar la propiedad DefaultLocation de "Application Folder" porque una vez generado el setup os puede dar el error que menciono en mi artículo anterior. En mi ejemplo [ProgramFilesFolder]\Service1 que nos lo instalará dentro de archivos de programa, en una carpeta llamada Service1.
13. Ahora generamos el proyecto de setup. Y una vez generado lo instalamos, para ésto pinchando sobre el setup.exe generado, o desde el visual studio con botón derecho sobre el proyecto de setup instalar.
14. Una vez instalado el servicio lo ponemos en marcha o bien reiniciando, o con botón derecho sobre "Mi Pc"/Administrar, nos vamos a Servicios y Aplicaciones\Servicios y buscamos el servicio que hemos instalado, para eso miramos en Descripción lo que hemos puesto en la propiedad "Description" o por nombre lo hemos puesto en DisplayName, y sobre él con botón derecho "Iniciar". Esperamos 10 segundos y nos vamos a C donde tenemos que tener un archivo log.txt.
15. Una vez probado podéis detener el servicio y desinstalarlo ya sea con el visual studio de la misma forma que lo hemos instalado o en agregar o quitar programas del panel de control. ¡¡¡¡¡No lo dejéis corriendo porque os puede llenar el disco con el tiempo!!!!!!
En este zip os podéis bajar el código fuente por si tenéis alguna duda. Y espero que os haya gustado.
Saludos.
Hola carmen… me ayudo mucho este articulo, ya entendi para crear el servicio, muchas gracias y felicidadez por tu blog, pero necesito que el servicio arranque automaticamente al prender la pc, ya intente con el administrador de servicios, pero nada, no se si al momento de desarrorralo tenga que hacer algo, espero y me puedas ayudar. de antemano gracias.
Holaaaa.. soy jorge,, pues me sirvio de mucho esta explicacion,,,uuuff hasta que le entendi,, pues con esto me ayudo a pasar mi examen de redes, tube que compartir archivos y de el servidor hacerlo a las otras maquinas,, bueno ps sigue asi suerte y gracias de nuevo,,
pues les dejo mi correo para por si necesitamos ayuda no,, todos pueden agregarme,,jor310_cecyt@hotmail.com
Vi tu foto carmen y uuuuuf estas muy guapa,,,pero toy chiquito jejejeje,, tengo 18 años,,bueno espero que me agreges adios,,cuidate besos,,
Hola, muy buen articulo pero tengo una pregunta, como agrego un botón que desinstale el producto sin tener que ejecutar de nuevo el setup.msi??
MUchas gracias me ha servido muchisimo
me ha marcado este error the service did not respond to the start or control request in a timely fashion si puedes ayudarme te lo agradecere mucho
ok ok muy bueno me salio ala perfeccion jeje muxas grasias creo k pasare mi examen de unidad con esto jeje grax bye
Muy buen post!!!
Hola Carmen, he descargado tu ejemplo y funciona perfecto, entiendo el concepto y me va a servir mucho para un desarrollo importante en mi oficina. Solo tengo una curiosidad y no se si omití algún paso o que pero cuando lo hice desde ceros y seguí tus pasos , me surgió un erro al instalarlo:
Error 1001. Error en la instalación debido a que no hay ningún ServiceProssesInstaller. ServiceProcessInstaller debe estar presente en el instalador contenedor o en la colección de instaladores en el mismo instalador que ServiceInstaller.
Si me puedes ayudar con eso, te agradecería inmensamente.
gracias me sirvió tu explicación.
hola, estaba intentando hacer un servicio siguiendo tus pasos (muy buen articulo, por cierto) y cuando tiro a instalar me dice error 1001 error en la instalacion debido a que no hay ningun service Proccess installer y si que lo tengo, no se como arreglarlo…gracias de antemano
Uff!! gracias
Hola como puede hacer para ejecutar la funcion shell() desde un servicio de windows, es posible hacerlo ?
Encontré lo que buscaba, gracias.
Hola, muy buen post. Pero tengo un problemilla. Hice un servicio que hace ping a los equipos en una red y luego escribe en un archivo las direcciones. Pero cuando le doy iniciar al servicio, me sale un mensaje del sistema operativo diciéndome que el servicio se detuvo automáticamente. Pero este mensaje me sale al instante que le doy inciar. Podrían ayudarme?
Hola, he realizado el tutorial paso a paso, cuando instalo me sale un error que dice codigo 2869. Alguien sabe a que se debe?
Muy buen post, la verdad, mas claro no se podia, muchas gracias.
Gracias Carmen me fue muy util.
muy buen post, la verdad que no es es trivial configurar la instalacion de un servicio.
muchas gracias.
hola, buenos dias, tengo un problemita con tu ejemplo, lo segui hasta la parte de instalacion,pero me marca un error, al momento de ejecutarlo,
——————-
error 1001 debe especificar un valor para source
—————
me podrias decir por que me aparece el error?
q estupenda aportacion!!!! gracias de veras es muy util y la informacion que he encontrado no me explicaba bien como hacerlo
Gracias Carmen. Había buscado otros tutoriales y no había logrado que me funcionara el servicio. Tuve que darle reset a la máquina para que arrancara el servicio, de la otra forma me daba acceso denegado. Tengo Windows 7 Enterprise N de 64 bits
Saludos
Márce;
Muuuuuyyyy Bueno muchas gracias como post como estos cualquiera sabe «programar».
Perfecto, tiene una gran capacidad para explicarlo muy claro. El requerimiento que tengo es conectarme a una base de datos y actualizar una tabla cada minuto la acutalizacion sera en otra base de datos yo esta pensando en crear un servicio windos que ejecute un job y este job a su vez un store procedure, crees que si es posible esto.
Gracias
Gracias me fue de gran ayuda