Crear Tareas Programadas desde C#


Ya vimos en un post anterior como crear tareas programadas en Windows Vista, con un Wizard que nos ofrece Windows, las tareas programadas pueden ser creadas también por líneas de comandos usando el comando schtasks o el comando at.

Vamos a crear tareas desde C#, usando una librería que encontré en CodeProject .

  1. Para empezar descargamos la librería, de la misma dirección podemos descargar el código fuente y la ayuda.
  2. Creamos un proyecto de Consola en Visual Studio, puede ser el 8, 9 o el Express cualquiera.
  3. Agregamos la referencia de la Dll para que se copie  a nuestro proyecto:
  4.  referenciaTask

  5. Ahora usamos la referencia en el código:
  6. using TaskScheduler;

  7. Para crear una tarea como se enseña en el diseño hay que crear primero una clase ScheduleTask y luego llamar el método CreateTask y ser asignado a un objeto Task,  en el código se explica mejor:
  8. using (ScheduledTasks Tareas = new ScheduledTasks())
    {
    
      Task tarea = Tareas.CreateTask("Prueba");
    }
    
    
  9. La palabra Prueba, es el nombre que tendrá la tarea programada.
  10. Ahora le decimos al objeto tarea el archivo que queremos que se ejecute, podemos crear un *.bat, o un *.exe, un *.txt, lo que sea:
  11. // archivo que vamos a ejecutar, escribimos la ruta completa
    
    tarea.ApplicationName = @"C:\Windows\System32\calc.exe";
    
    
  12. Podemos agregar una descripción de la tarea:
  13. tarea.Comment = "Tarea que abre la calculadora";
    
    
  14. Como sabemos, para ejecutar una tarea necesitamos un usuario, y si es administrador mucho mejor:
  15. // configurar la cuenta con la que se ejecutara la tarea
    
    tarea.SetAccountInformation("usuario", "password");
    
    
  16. Para decirle la periocidad de la tarea, agregamos Triggers o disparadores a la tarea, podemos escoger diariamente:
  17. // agregamos el disparador, la tarea se ejecutara diariamente a las 6 y 15 pm
    
    tarea.Triggers.Add(new DailyTrigger(18, 15));
    
    
  18. Semanalmente, podemos decirle que días queremos que se ejecute, los días van separados por | :
  19. 
    tarea.Triggers.Add(new WeeklyTrigger(18,15,DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday));
    
    
  20. Mensualmente, debemos declarar un array de enteros, con los días del mes en que queremos que se ejecute la tarea:
  21. int []dias =new int[] {1,15};
    
    tarea.Triggers.Add(new MonthlyTrigger(18,15,dias));
    
    
  22. Despues de haber escogido la periocidad podemos modificar el limite de duración, la prioridad, parámetros y otras cosas:
  23. // limitar la duración de la tarea programada
    tarea.MaxRunTime = new TimeSpan(0, 15, 0);
    tarea.Creator = "Martín Reina";
    // prioridad de la tarea
    
    tarea.Priority = System.Diagnostics.ProcessPriorityClass.Normal;
    
    
  24. Cuando hayamos acabado de configurar la tarea, guardamos:

tarea.Save();

El código completo es:


using (ScheduledTasks Tareas = new ScheduledTasks())

            {

                Task tarea = Tareas.CreateTask("Prueba");

                // archivo que vamos a ejecutar, escribimos la ruta completa

                tarea.ApplicationName = @"C:\Windows\System32\calc.exe";

                tarea.Comment = "Tarea que abre la calculadora";

                // configurar la cuenta con la que se ejecutara la tarea

                tarea.SetAccountInformation("usuario", "password");

                // limitar la duración de la tarea programada

                tarea.MaxRunTime = new TimeSpan(0, 15, 0);

                tarea.Creator = "Martín Reina";

                // prioridad de la tarea

                tarea.Priority = System.Diagnostics.ProcessPriorityClass.Normal;

                // agregamos el disparador, la tarea se ejecutara diariamente a las 6 y 15 pm

                //tarea.Triggers.Add(new DailyTrigger(18, 15));

                int []dias =new int[] {1,15};

                tarea.Triggers.Add(new MonthlyTrigger(18,15,dias));

                tarea.Save();

           }

Si ejecutamos la aplicación y luego verificamos el Task Scheduler (Donde están las tareas guardadas):

 ScheduledTask

 

Bien, ahora podemos comenzar a programar más tareas con muchas más opciones, borrar tareas creadas, detener tareas que se encuentren ejecutando, abrir tareas para modificarlas, listar las tareas.

25 pensamientos en “Crear Tareas Programadas desde C#

    • Si te refieres a donde se ven las tareas de Windows o las que creamos, puedes hacer la fácil y en Inicio escribes TaskScheduler, o puedes ir a Panel de Control -> System and Security -> Administrative Tools ->Task Scheduler

  1. tengo un problema a la hora de crear las tareas de modo que se ejecuten a intervalos regulares. El problema es que el metodo NextRunTimeAfter solo me calcula la proxima vez que se ejecutara la tarea a partir de un momento dado. Pero yo lo que deseo hacer es madarla a ejecutar cada X minutos, horas, dias, etc. Y no hay un metodo predefinido que me establesca estos intervalos regulares, Alguna sugerencia ???

    • Hola, si estas usando la misma Dll en la que uso en el post, puedes usar lot triggers para indicarle a la tarea que se ejecute cada día, cada mes, si es otra Dll mira si tiene algún método para adicionar Triggers que es lo que más usan para programar la tarea

  2. Hola, estoy empezando a crear mis proyectos en c# .net y hay muchas cosas que parecen obvias pero que simplemente no las capto. Hice todo el proceso que indicas, agregue un proyecto de consola y en automatico me crea una clase. En ella puse el using para llamar la libreria y copie todo el codigo que tienes pero en esta parte … using ScheduledTasks Tareas = new ScheduledTasks() me dice que hace falta una estructura, enumeracion, delegado o clase lo mismo me dice con ….. tarea.MaxRunTime = new TimeSpan(0, 15, 0);

    De antemano agradezco la ayuda.

  3. Hola, si me faltaba agregar la DLL. Muchas gracias :D. Ahora tengo otro detalle. Al publicar la aplicación e intentar agregar una tarea me genera un error, diciendo que tengo el acceso denegado. Ya intente poner el usuario del IIS pero la tarea no se ejecuta.

    De antemano, Gracias por tu ayuda.

    • Cuando asignas el usuario que va a ejecutar la tarea (tarea.SetAccountInformation(«usuario», «password»);) verificaste que el usuario si fuera Administrador o tuviera permisos para ejecutar el servicio de tareas programadas?.

  4. Hola, gracias por responder tan rápido 🙂 .. Si, verifique que el usuario fuera administrador. De hecho le doy mi usuario y contraseña, publico la aplicación y al momento de agregar la tarea me manda el error. Verifico en las tareas programadas y esta la tarea pero no puede ejecutar el archivo. Entro a la tarea, a través de windows, esta con mi usuario y me vuelve a pedir la contraseña, se la doy, guardo y ejecuta sin problemas. La aplicación la consulto desde la web, le doy https:\ ruta\pagina.aspx.

    Muchas gracias por tu apoyo.

    • Hola, si usas la misma librería que uso en el post, puedes obtener el listado de las tareas, luego obtener la tarea que necesitas, y llamar el método Terminate():
      st = new ScheduledTasks();
      ListTasks(st);

      static void ListTasks(ScheduledTasks st) {
      string[] taskNames = st.GetTaskNames();
      foreach (string name in taskNames) {
      Task t = st.OpenTask(name);
      t.Terminate();
      t.Close();
      }
      }

  5. Hola, funciono muy bien la dll en windows 7 y cuando lo publico en windows server 2003 no funciona, al momento de crear la tarea me dice «instancia de objeto no establecida como instancia de un objeto» te ha pasado este error? Saludos y de antemano gracias.

    • Hola, para hacer las repeticiones, solo debes de generar un trigger y especificar durante cuanto tiempo se repetira y por cada cuanto tiempo, algo asi

      Trigger ntg = new DailyTrigger(08, 00);
      int duration = 720;
      int intervalo = tiempo;
      ntg.DurationMinutes = duration;
      ntg.IntervalMinutes = intervalo;

Replica a felipe Cancelar la respuesta