Crear e instalar un Servicio Windows paso a paso

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"
  • Para el elemento ServiceProcessInstaller
    • 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.

26 Responses to Crear e instalar un Servicio Windows paso a paso

  1. Jose Clemente says:

    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.

  2. jorge says:

    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,,

  3. jorge says:

    pues les dejo mi correo para por si necesitamos ayuda no,, todos pueden agregarme,,jor310_cecyt@hotmail.com

  4. jorge says:

    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,,

  5. Edgar Rafael says:

    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??

  6. MARY says:

    MUchas gracias me ha servido muchisimo

  7. MARY says:

    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

  8. miguel says:

    ok ok muy bueno me salio ala perfeccion jeje muxas grasias creo k pasare mi examen de unidad con esto jeje grax bye

  9. JESUS ALBERTO says:

    Muy buen post!!!

  10. Fabian Andres says:

    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.

  11. oscar says:

    gracias me sirvió tu explicación.

  12. javichere says:

    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

  13. alex says:

    Uff!! gracias

  14. Daniel says:

    Hola como puede hacer para ejecutar la funcion shell() desde un servicio de windows, es posible hacerlo ?

  15. Andres says:

    Encontré lo que buscaba, gracias.

  16. wilson says:

    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?

  17. Pablo says:

    Hola, he realizado el tutorial paso a paso, cuando instalo me sale un error que dice codigo 2869. Alguien sabe a que se debe?

  18. Corsario says:

    Muy buen post, la verdad, mas claro no se podia, muchas gracias.

  19. Ricardo says:

    Gracias Carmen me fue muy util.

  20. alejandro varela says:

    muy buen post, la verdad que no es es trivial configurar la instalacion de un servicio.
    muchas gracias.

  21. Jairo Contreras says:

    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?

  22. Christian ecro says:

    q estupenda aportacion!!!! gracias de veras es muy util y la informacion que he encontrado no me explicaba bien como hacerlo

  23. Márcel Plasencia Márquéz says:

    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;

  24. Alejandro R. says:

    Muuuuuyyyy Bueno muchas gracias como post como estos cualquiera sabe «programar».

  25. Ruy says:

    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

  26. Sergio says:

    Gracias me fue de gran ayuda

Replica a miguel Cancelar la respuesta