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
GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Administratoren - Kompakt

Nach dieser Schulung beherrschen Sie die Grundlagen des TFS. Sie erledigen administrative Aufgaben schnell und sicher.

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

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!