如何在 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# 中列出计划任务的主要内容,如果未能解决你的问题,请参考以下文章