如何在C#中列出计划任务

时间:2016-12-28 16:25:45

标签: c# .net task scheduled-tasks

在有人说这是重复之前,我已经检查了herehereherehere以及其他一些资源,包括{{3} }。

我希望能够使用正在开发的C#程序在我的服务器上列出计划任务。有人建议schtasks.exe MS程序,其他人MS Task Scheduler Class documentation,这看起来很旧,只能用于.NET Framework 2.0和其他third-party library,这似乎受到保护,我还没看到一些例子所以我理解如何使用它,其他人甚至建议在C:\ Windows \ System32 \ Tasks文件夹下读取每台远程机器中的XML文件。

我的问题是:Windows中的任务是否难以使用某些VS内置类?我是否必须通过箍来做某事(有点)愚蠢地列出已在机器中安排的任务?

谢谢,

编辑:

我最终使用Process类并针对所有服务器启动了schtasks.exe。不完全是我正在寻找但它的工作原理。如果有人需要代码,请给我一行,然后在此发布。感谢。

3 个答案:

答案 0 :(得分:5)

啊,System.Threading.TaskScheduler用于调度进程中的工作单元,与您可以从管理工具创建的计划任务无关。

我会使用像https://taskscheduler.codeplex.com/这样的库 - 用Google搜索,我用2004年的一个糟糕的COM包装器做类似的事情,我一直想要更新。它可以很容易地看到计划任务中的内容。

E.g。来自他们的“枚举所有任务”的例子

void EnumAllTasks()
{
   using (TaskService ts = new TaskService())
      EnumFolderTasks(ts.RootFolder);
}

void EnumFolderTasks(TaskFolder fld)
{
   foreach (Task task in fld.Tasks)
      ActOnTask(task);
   foreach (TaskFolder sfld in fld.SubFolders)
      EnumFolderTasks(sfld);
}

void ActOnTask(Task t)
{
   // Do something interesting here
}

答案 1 :(得分:3)

在Visual Studio中,将引用添加到COM \ Type库中: TaskScheduler

并使用Taskschd API: https://docs.microsoft.com/en-us/windows/desktop/api/taskschd

这是我做事方式的一个例子:

您检索具有访问权限的任务,具体取决于您是使用本地帐户还是管理员帐户运行代码。

我的解决方案是通过运行在我们服务器中的具有本地系统帐户的Windows服务来完成此操作。

using TaskScheduler;

void ProcessTaskFoler (ITaskFolder taskFolder)
{
    int idx;
    string name, path;
    _TASK_STATE state;

    IRegisteredTaskCollection taskCol = taskFolder.GetTasks((int)_TASK_ENUM_FLAGS.TASK_ENUM_HIDDEN);  // include hidden tasks, otherwise 0
    for (idx = 1; idx <= taskCol.Count; idx++)  // browse al tasks in folder
    {
        IRegisteredTask runTask = taskCol[idx];  // 1 based index

        name = runTask.Name;
        path = runTask.Path;
        state = runTask.State;
        // retrieve other properties...

        Console.WriteLine(path);
    }

    ITaskFolderCollection taskFolderCol = taskFolder.GetFolders(0);  // 0 = reserved for future use
    for (idx = 1; idx <= taskFolderCol.Count; idx++)  // recursively browse subfolders
        ProcessTaskFoler(taskFolderCol[idx]);  // 1 based index
}

void ParseScheduleTasks()
{
    ITaskService taskService = new TaskScheduler.TaskScheduler();
    taskService.Connect();

    ProcessTaskFoler(taskService.GetFolder("\\"));
}

答案 2 :(得分:1)

为什么不在C#代码中使用powershell? Reference this for implementing powershell in your application.

使用powershell here's the link to do that.

在PC /服务器上查找预定任务

结合使用它们以及在C#应用程序中读取powershell输出,以及 Voila。