任务计划程序托管包装器不显示所有任务

Posted

技术标签:

【中文标题】任务计划程序托管包装器不显示所有任务【英文标题】:Task Scheduler Managed Wrapper does not show all tasks 【发布时间】:2016-09-05 08:58:53 【问题描述】:

我创建了一个简单的 Windows 窗体应用程序,它显示机器上所有计划任务的名称和文件夹。我正在使用任务计划程序托管包装器(Microsoft.Win32.TaskScheduler),下面是获取名称并显示它们的代码。但是,似乎 AllTask​​s 实际上并没有给我所有任务。有一些没有显示。在这种情况下,什么可能导致任务被隐藏?

using (TaskService tsksrvs = new TaskService())

    foreach (Task tsk in tsksrvs.AllTasks)
    
        textJobsList.Text += tsk.Name + " (" + tsk.Folder + ")" + Environment.NewLine;
    

【问题讨论】:

那么,哪些任务隐藏的?也许是其他用户的? @nvoigt 你是对的。问题似乎是任务是由另一个用户而不是运行代码的用户运行的。谢谢! 【参考方案1】:

对象Microsoft.Win32.TaskScheduler.TaskService 的属性AllTasks返回任务.Definition.Principal.UserId 为任一的Windows 调度程序任务 运行程序的用户系统网络服务本地服务为空。顺便说一句,Definition.RegistrationInfo.Author 属性的值无关紧要。

如果您需要为所有用户获取所有任务,您可以通过以下代码完成:

using Microsoft.Win32.TaskScheduler;
using System.Diagnostics;
using System.Text.RegularExpressions;
......................................
                Task[] allTasks = TaskService.Instance.FindAllTasks(new Regex(".*")); // this will list ALL tasks for ALL users
                foreach (Task tsk in allTasks)
                
                    //Do whatever you need here, for example:
                    Debug.WriteLine("TaskName:0; Path:1; Author:2; Principal: 3; ", tsk.Name, tsk.Path, tsk.Definition.RegistrationInfo.Author, tsk.Definition.Principal.UserId);
                

【讨论】:

【参考方案2】:

正如@nvoigt 在上面指出的那样,不可见的任务正在以与执行代码的用户不同的用户身份运行。

【讨论】:

如果您的应用以管理员身份运行,您可能会看到它们。 我也遇到了同样的问题,但是 .FindAllTask​​s(new RegEx(.*)) 也没有找到它们(在 LINQPad 中测试)。在 .FindAllTask​​s(...) 返回我正在寻找的任务之前,我必须以管理员身份运行 LINQPad。 FindAllTask​​s 方法的参数为任意值,只会查找系统确定当前账户有权查看的任务。注册时默认编写的每个任务实际上都有ACL。如该线程所述,要查看所有任务,您必须拥有所有权限,即管理员身份。

以上是关于任务计划程序托管包装器不显示所有任务的主要内容,如果未能解决你的问题,请参考以下文章

进程和计划任务管理

进程与计划任务管理

Linux进程和计划任务管理

进程和计划任务管理

浅谈centOS系统进程和计划任务

任务计划程序显示错误“指定的查询无效”