Feedback

C# - Windows Aufgabenplaner / TaskScheduler benutzen

Veröffentlicht von am 22.02.2018
(0 Bewertungen)
Diese kleine Klasse ermöglicht es für den Windows eigenen Aufgabenplaner
- Aufgaben zu erzeugen
- Aufgaben zu löschen
- Aufgaben zu ändern
- Pfade anzulegen.

Anwendung
Eine AutoRun Aufgabe bei der Anmeldung des Benutzers:

scheduler = new Scheduler ("MeinPfadImAufgabenplaner" ); // Zugriff auf den Pfad nehmen, der Pfad wird bei Bedarf neu erzeigt.
scheduler.AddAutorunTask (Environment.UserName, "C:\\Windows\\notepad.exe", null, null); // Aufgabe erzeugen
scheduler.AddAutorunTask (Environment.UserName, "C:\\Windows\\write.exe", null, null); // Aufgabe überschreiben
scheduler.RemoveTask (Environment.UserName); // Aufgabe löschen
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using TaskScheduler;

// https://msdn.microsoft.com/en-us/library/windows/desktop/aa382542(v=vs.85).aspx
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa381911(v=vs.85).aspx

namespace diub.Sys {

	public class Scheduler {

		private ITaskFolder folder;
		private TaskScheduler.TaskScheduler taskService;

		/// <summary>
		/// 
		/// </summary>
		/// <param name="Path">Der vollständige Pfad innerhalb des Aufgabenplaners, unter dem die Aufgaben bearbeitet werden.</param>
		public Scheduler (String Path) {
			taskService = new TaskScheduler.TaskScheduler ();
			taskService.Connect ();
			folder = CreatePath (Path);
			if (folder == null)
				throw new Exception ("Folder access denied!");  // Konstruktor Fehler :-/
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="Path">Vollständiger Pfad wie "\diub\Test"</param>
		/// <returns></returns>
		public ITaskFolder CreatePath (String Path) {
			int i;
			String path;
			String [] parts;
			ITaskFolder folder;

			path = Path.Replace ('/', '\\').Trim ('\\');
			parts = path.Split ('\\');
			path = "";
			folder = taskService.GetFolder ("\\");
			for (i = 0; i < parts.Length; i++) {
				try {
					folder.CreateFolder (parts [i]);
				} catch (Exception) { } // bei jedem bereits existierenden Pfad, daher einfach ignorieren
				path += "\\" + parts [i];
				try {
					folder = taskService.GetFolder (path);
				} catch (Exception) {
					return null;    // das sollte nicht vorkommen: NULL als Fehler
				}
			}
			return folder;
		}

		public bool TaskExists (String Name) {
			return GetTask (Name) != null;
		}

		public IRegisteredTask GetTask (String Name) {
			IRegisteredTask task;

			try {
				task = folder.GetTask (Name);
				return task;
			} catch (Exception) {
				return null;
			}
		}

		public bool RemoveTask (String Name) {
			try {
				folder.DeleteTask (Name, 0);    // Flags not supported - also egal
				return true;
			} catch (Exception) {
				return false;
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="Name"></param>
		/// <param name="PathFilename"></param>
		/// <param name="Username">Darf Null sein für den gerade aktiven Benutzer</param>
		/// <param name="Password">Darf Null sein für den gerade aktiven Benutzer</param>
		public void AddAutorunTask (String Name, String PathFilename, String Username, String Password) {
			ITaskDefinition definition;
			ITrigger trigger;
			IActionCollection actions;
			IAction action;
			IExecAction exec_action;
			IRegisteredTask registerd_task;

			definition = taskService.NewTask (0);
			definition.Settings.Enabled = true;
			// taskDefinition.Settings.Priority  // :: die Priorität der Aufgabe, NICHT die Priorität des erzeugten Prozesses
			definition.Settings.Compatibility = _TASK_COMPATIBILITY.TASK_COMPATIBILITY_V2_1;
			definition.Settings.StopIfGoingOnBatteries = false;
			definition.Settings.DisallowStartIfOnBatteries = false;

			// Rechte des Processes
			definition.Principal.RunLevel = _TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;
			definition.Principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN;

			//create trigger for task creation.
			trigger = definition.Triggers.Create (_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);
			(trigger as ILogonTrigger).UserId = taskService.ConnectedUser;
			//_trigger.StartBoundary = DateTime.Now.AddSeconds (15).ToString ("yyyy'-'MM'-'dd'T'HH':'mm':'ss");
			//_trigger.EndBoundary = DateTime.Now.AddMinutes (1).ToString ("yyyy'-'MM'-'dd'T'HH':'mm':'ss");
			trigger.Enabled = true;

			actions = definition.Actions;
			action = actions.Create (_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
			exec_action = action as IExecAction;
			exec_action.Path = "\"" + PathFilename + "\"";     // tatsächlich PathFilename in Hochkommata, Bezeichner "Path" ist schlicht falsch
			exec_action.WorkingDirectory = System.IO.Path.GetDirectoryName (PathFilename); // darf nicht in Hochkommata eingeschlossen werden

			// das Toklen muss(!) mit dem der Aufgabe oben übereinstimmen: _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN
			registerd_task = folder.RegisterTaskDefinition (Name, definition, 6, Username, Password, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, null);
		}

	}   // class

}   //	namespace	2018-02-22 - 15.24

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!