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

在有人说这是重复之前,我已经检查了 herehereherehere 以及其他一些资源,包括 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 中不存在。

标签: c# .net task scheduled-tasks


【解决方案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
    }
    

    【讨论】:

    【解决方案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
      猜你喜欢
      • 2014-05-22
      • 1970-01-01
      • 2012-04-19
      • 2012-02-07
      • 1970-01-01
      • 2021-03-27
      • 2011-09-22
      • 2010-09-22
      相关资源
      最近更新 更多