There is a managed wrapper for the TaskScheduler found on CodePlex.
And using that wrapper it is possible to enumerate the tasks:
using System;
using Microsoft.Win32.TaskScheduler;
namespace ListTasks
{
class Program
{
static void EnumFolderTasks(TaskFolder fld)
{
foreach (Task task in fld.Tasks)
DisplayTask(task);
foreach (TaskFolder sfld in fld.SubFolders)
EnumFolderTasks(sfld);
}
static void DisplayTask(Task t)
{
Console.WriteLine("Task: {0, -60} Active: {1, -5} Enabled: {2, -5}",
t.Name, t.IsActive, t.Enabled);
}
static void Main(string[] args)
{
using (TaskService ts = new TaskService())
{
EnumFolderTasks(ts.RootFolder);
}
}
}
}
As to whether the Id, Status, Start time, Duration and Location information is available, I'm not sure.
But looking at the definition of the Task object it does contain lots of information and at first glance most of that information does seem to be available:
EDIT: Added namespace to remove some confusion about the Task object.
namespace Microsoft.Win32.TaskScheduler
{
public class Task : IDisposable
{
public TaskDefinition Definition { get; }
public bool Enabled { get; set; }
public TaskFolder Folder { get; }
public bool IsActive { get; }
public DateTime LastRunTime { get; }
public int LastTaskResult { get; }
public string Name { get; }
public DateTime NextRunTime { get; }
public int NumberOfMissedRuns { get; }
public string Path { get; }
public bool ReadOnly { get; }
public GenericSecurityDescriptor SecurityDescriptor { get; set; }
public virtual TaskState State { get; }
public TaskService TaskService { get; }
public string Xml { get; }
public void Dispose();
public void Export(string outputFileName);
public TaskSecurity GetAccessControl();
public TaskSecurity GetAccessControl(AccessControlSections includeSections);
public RunningTaskCollection GetInstances();
public DateTime GetLastRegistrationTime();
public DateTime[] GetRunTimes(DateTime start, DateTime end, uint count = 0);
public string GetSecurityDescriptorSddlForm(SecurityInfos includeSections = SecurityInfos.Owner | SecurityInfos.Group | SecurityInfos.DiscretionaryAcl);
public void RegisterChanges();
public RunningTask Run(params string[] parameters);
public RunningTask RunEx(TaskRunFlags flags, int sessionID, string user, params string[] parameters);
public void SetAccessControl(TaskSecurity taskSecurity);
public void SetSecurityDescriptorSddlForm(string sddlForm, TaskSetSecurityOptions options = TaskSetSecurityOptions.None);
public void ShowPropertyPage();
public void Stop();
public override string ToString();
}
}