08
apr
09

controllare il task scheduler di Windows in .NET

Il Task Scheduler (o Utilità di pianificazione, per coloro che hanno Windows in italiano), è uno strumento molto versatile ed integrato in Windows, che permette di programmare delle operazioni da eseguire in determinati momenti della giornata, della settimana, del mese o anno, a determinate condizioni e permette di associare delle azioni nel caso venga verificato l’evento.

In questo articolo descrivo brevemente come utilizzare le API esposte dal Task Scheduler in C#.

TaskScheduler - Finestra principale

Bisogna partire creando un progetto Console o Windows Forms.

Ora bisogna aggiungere un riferimento alla libreria che contiene il set di API: taskschd.dll. Il file si trova in %WINDIR%\System32\.

taskscheduler-addreference1

Una volta aggiunto il riferimento si può notare che Visual Studio genera automaticamente un wrapper per la libreria aggiunta, dovrebbe chiamarsi TaskScheduler.

Ora finalmente si può passare al codice.

La prima cosa da sapere è che il Task Scheduler può essere anche amministrato da remoto, quindi bisogna prima connettersi ad esso passando a tutti i parametri il valore null, in quanto l’obiettivo è connettersi a quello locale:

1 TaskSchedulerClass scheduler = new TaskSchedulerClass();

2

3 scheduler.Connect(null, null, null, null);

Ora si possiede un’istanza della classe TaskSchedulerClass, questa classe permette di creare Task, gestire le cartelle ecc… La classe TaskSchedulerClass dovrebbe trovarsi nel namespace TaskScheduler (che è anche il nome del wrapper creato da Visual Studio).

Il prossimo passo è creare il Task vero e proprio, quindi si richiama il metodo NewTask della classe TaskSchedulerClass e si assegnano le varie proprietà:

1 ITaskDefinition task = scheduler.NewTask(0);

2

3 task.RegistrationInfo.Author = “Umar Jamil”;

4 task.RegistrationInfo.Date = DateTime.Now.ToString(“yyyy-MM-ddThh:mm:ss”);

5 task.RegistrationInfo.Description = “Visualizza un messaggio di promemoria”;

La prima cosa da notare è il formato della data che la libreria accetta: ANNO-MESE-GIORNO + T + ORA:MINUTI:SECONDI. Io ho impostato veramente poche proprietà. La classe task espone una proprietà Settings che permette di specificare a quali condizioni di batteria, di connessione internet ecc.. il task deve essere avviato. Provate voi a smanettare.

Ora che si ha un oggetto ITaskDefinition, bisogna specificare il trigger, cioé l’azione che scatenerà il task, che può essere un range temporale, un task che viene ripetuto ogni giorno alla stessa ora ed altro. Per fare ciò, bisogna creare il trigger ed assegnarlo ad un’istanza dell’oggetto che lo rappresenta:

1 IDailyTrigger dailyTrigger = (IDailyTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);

2

3 dailyTrigger.DaysInterval = 1;

4 dailyTrigger.StartBoundary = DateTime.Now.ToString(“yyyy-MM-ddThh:mm:ss”);

Bisogna inanzitutto specificare che tipo di trigger si vuole, e quindi effettuare il casting al tipo che lo rappresenta. Nel caso di IDailyTrigger, bisogna specificare a partire da quale data esso è attivo e ogni quanti gioni deve essere avviato, in questo caso ogni giorno (se fosse stato DaysInterval = 2, il task sarebbe stato avviato un giorno si ed un giorno no).

Dopo aver specificato i vari triggers, si può passare a cosa deve effettuare il task se avviato. Esistono tre tipi di azioni:

  • Avvio di un programma
  • Invio di una email
  • Visualizzazione di un messaggio (la classica MessageBox).

Ecco mostrati i tre casi:

1 IExecAction execAction = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);

2 execAction.Arguments = “newfile.txt”;

3 execAction.Path = “notepad.exe”;

4 execAction.WorkingDirectory = @”C:\Windows\System32″;

5 execAction.Id = “Avvia internet explorer”;

1 IEmailAction emailAction = (IEmailAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_SEND_EMAIL);

2 emailAction.Body = “qui va il testo del messaggio”;

3 emailAction.From = “XXXXXXXXXX”;

4 emailAction.To = “XXXXXXXXXX”;

5 emailAction.Subject = “Oggetto della email”;

6 emailAction.Id = “Invia una email”;

1 IShowMessageAction action = (IShowMessageAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_SHOW_MESSAGE);

2 action.MessageBody = “Dai un’occhiata ai commenti sul blog e rispondi!”;

3 action.Title = “Urgente!”;

4 action.Id = “Mostra il messaggio”;

L’ultimo passo da effettuare è la registrazione del task in una cartella. I task sono organizzati in cartelle, ad esempio esiste la cartella Microsoft. Io utilizzerò quella di root, così che il task appaia subito all’apertura dell’utility Task Scheduler. Il processo di registrazione avviene prima di tutto ottenendo un’istanza della classe ITaskFolder e poi registrando il task dentro quest’ultima.

1 ITaskFolder mainFolder = scheduler.GetFolder(@”\”);

2 IRegisteredTask registeredTask = mainFolder.RegisterTask(

3 “TaskSchedulerDemo”, task.XmlText,

4 (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,

5 null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, null);

Il primo parametro del metodo RegisterTask è il nome che si vuole assegnare a quest’ultimo, il secondo è la definizione del task, il terzo indica il tipo di azione desiderata: Aggiunta, Sostituzione, Validare, Disabilitare. In questo caso si vuole solo aggiungere il task, e se esiste già, aggiornarlo.

Ora il task è pronto! Lo si può avviare da codice utilizzando l’istanza della classe IRegisteredTask e richiamando il metodo Run, o aspettare che Windows lo esegua quando previsto.

1 TaskSchedulerClass scheduler = new TaskSchedulerClass();

2

3 scheduler.Connect(null, null, null, null);

4

5 ITaskDefinition task = scheduler.NewTask(0);

6

7 task.RegistrationInfo.Author = “Umar Jamil”;

8 task.RegistrationInfo.Date = DateTime.Now.ToString(“yyyy-MM-ddThh:mm:ss”);

9 task.RegistrationInfo.Description = “Visualizza un messaggio di promemoria”;

10

11 // Triggers

12

13 IDailyTrigger dailyTrigger = (IDailyTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);

14

15 dailyTrigger.DaysInterval = 1;

16 dailyTrigger.StartBoundary = DateTime.Now.ToString(“yyyy-MM-ddThh:mm:ss”);

17

18 IShowMessageAction action = (IShowMessageAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_SHOW_MESSAGE);

19 action.MessageBody = “Dai un’occhiata ai commenti sul blog e rispondi!”;

20 action.Title = “Urgente!”;

21 action.Id = “Mostra il messaggio”;

22

23 //IEmailAction emailAction = (IEmailAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_SEND_EMAIL);

24 //emailAction.Body = “qui va il testo del messaggio”;

25 //emailAction.From = “XXXXXXXXXX”;

26 //emailAction.To = “XXXXXXXXXX”;

27 //emailAction.Subject = “Oggetto della email”;

28 //emailAction.Id = “Invia una email”;

29

30 //IExecAction execAction = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);

31 //execAction.Arguments = “www.contoso.com”;

32 //execAction.Path = “notepad.exe”;

33 //execAction.WorkingDirectory = @”C:\Windows\System32″;

34 //execAction.Id = “Avvia internet explorer”;

35

36 ITaskFolder mainFolder = scheduler.GetFolder(@”\”);

37 IRegisteredTask registeredTask = mainFolder.RegisterTask(

38 “TaskSchedulerDemo”, task.XmlText,

39 (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,

40 null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, null);

41

42 Console.WriteLine(“Done!”);

43 Console.ReadLine();

Ecco qui il risultato finale nella finestra del Task Scheduler o Utilità di pianificazione:

TaskScheduler - Final Result

E’ tutto, per i geeks che non si accontentano, rimando alla documentazione su MSDN.


0 Risposte a “controllare il task scheduler di Windows in .NET”



  1. Lascia un commento

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s


aprile: 2009
L M M G V S D
« mar    
 12345
6789101112
13141516171819
20212223242526
27282930  

Follow

Get every new post delivered to your Inbox.