在有人说这是重复之前,我已经检查了here,here,here,here以及其他一些资源,包括{{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。不完全是我正在寻找但它的工作原理。如果有人需要代码,请给我一行,然后在此发布。感谢。
答案 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。