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

Posted

技术标签:

【中文标题】如何在 C# 中列出计划任务【英文标题】:How to list scheduled tasks in C# 【发布时间】:2017-05-12 23:16:58 【问题描述】:

在有人说这是重复之前,我已经检查了 here、here、here、here 以及其他一些资源,包括 MS Task Scheduler Class documentation。

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

我的问题是:Windows 中的任务是否难以使用某些 VS 内置类来处理?为了做一些(有点)愚蠢的事情,比如列出已经在机器上安排的任务,我是否必须跳过障碍?

谢谢,

编辑:

我最终使用了 Process 类并针对所有服务器启动了 schtasks.exe。不完全是我想要的,但它有效。如果有人需要代码,请给我留言,我将其发布在这里。谢谢。

【问题讨论】:

在 MS 任务计划程序类的上下文中,“似乎受到保护”是什么意思? @JimMischel,在 [MS 文档] (msdn.microsoft.com/en-us/library/…) 中说构造函数受到保护。 是的,但是TaskScheduler.Current 是静态的和公开的,TaskScheduler.Default 也是如此。构造函数仅供派生类使用。在任何情况下,该类似乎都不是操作系统计划任务列表的接口。 您能否发布您的解决方案作为答案。 我很惊讶这在 .Net Framework 中不存在。 【参考方案1】:
            using (TaskService ts = new TaskService())
            
                Task t = ts.GetTask(TaskName);
                if (t != null)
                
                   //Do your operation here
                
                 

【讨论】:

【参考方案2】:

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

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

例如来自他们的“枚举所有任务”示例

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

【讨论】:

这个库很好用。源代码现已移至github.com/dahall/TaskScheduler。您可以从nuget.org/packages/TaskScheduler 或使用您的包管理器下载 nuget 包。【参考方案3】:

在 Visual Studio 中,在 COM\Type Libraries 中添加引用: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("\\"));

【讨论】:

【参考方案4】:

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

对于使用 powershell 在 PC/服务器上查找计划任务,here's the link to do that.

将它们与读取 C# 应用程序中的 powershell 输出相结合,瞧。

【讨论】:

我刚刚检查过,显然 PowerShell Get-ScheduledTask 和 Get-ScheduledTaskInfo cmdlet 无法检索我正在寻找的“以用户身份运行”字段。也许我将不得不求助于 schtask.exe

以上是关于如何在 C# 中列出计划任务的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的 c# 程序作为计划任务运行

cron计划任务

使用 C# 任务计划库启用/禁用任务

在设置中添加计划任务?

远程计算机中的 C# 任务计划程序

由任务计划程序启动时隐藏 C# winform 应用程序窗口