在Windows任务调度程序中更改已调度任务的运行时间

问题描述:

我在修改机器上已存在的任务时遇到问题。我试图用C#生成的interop接口(system32/taskschd.dll生成的Interop.TaskScheduler.dll)来完成此操作。在Windows任务调度程序中更改已调度任务的运行时间

要开始,我不能使用其他库如http://taskscheduler.codeplex.com/。 已经过测试,可以与之前提到的库一起使用。现在当我尝试做与生成的接口相同的东西时,没有什么改变基本上我在做什么:

string STR_DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; 
string taskName = "taskName", 
     user = "user", 
     pass = "pass"; 

DateTime nextRun = new DateTime.Now.AddDays(7); 

TaskSchedulerClass ts = new TaskSchedulerClass(); 
ts.Connect(null, null, null, null); 
IRegisteredTask task = ts.GetFolder("\\").GetTask(String.Format("\\{0}",taskName)); 

foreach (ITrigger t in task.Definition.Triggers) 
    t.StartBoundary = nextRun.ToString(STR_DateTimeFormat.Replace(" ", "T")); 

ts.GetFolder("\\").RegisterTaskDefinition(task.Path, 
          task.Definition, 
          (int)_TASK_CREATION.TASK_UPDATE, 
          user, 
          pass, 
          _TASK_LOGON_TYPE.TASK_LOGON_PASSWORD, 
          null); 

因为这应该是工作先来看看,但由于某些原因,当我试图在线路分配新的datetime的运行:

t.StartBoundary = nextRun.ToString(STR_DateTimeFormat.Replace(" ", "T")); 

它不工作。实际上,在那个foreach中它已经改变了,但是当我试图调试并创建另一个打印StartBoundary值的foreach时,它显示了旧值。我做错了什么吗?有没有机会让它工作? :-) 谢谢。

+2

已解决。对于任何有类似问题的人,您必须在修改任务之前创建任务副本。获得IRegisteredTask后添加这些行。 'ITaskDefinition task = ts.NewTask(0); task = oldTask.Definition;' – mariozski 2011-12-29 15:42:16

+0

我需要实现相同的任务(更新已调度任务的运行时间),并且实现了此解决方案。第一次执行时更新时间。但在第二次,RegisterTaskDefinition抛出AccessDeniedException。有人可以帮忙吗? – Dash 2017-03-16 06:03:02

+0

很难说...当用户在哪个应用程序更改任务运行时没有足够的权限来更改任务定义(即不是本地管理员),通常会引发此问题。我不明白为什么你不能两次改变同一个任务。 – mariozski 2017-03-22 22:57:37

如果您尝试使用任务计划程序C#API来更新任务,则需要声明新的ITaskDefinition。如果您尝试更改现有定义并重新注册,则不起作用。

IRegisteredTask oldTask = ... 
ITaskDefinition task = oldTask.Definition; 

//modifications to oldTask.Definition/task 

//does **not** work 
folder.RegisterTaskDefinition(oldTask.Name, oldTask.Definition, ... 
//does work 
folder.RegisterTaskDefinition(oldTask.Name, task, ... 

答案功劳去原来的海报,看问题的评论。我写了这个答案来澄清这个问题,并提请注意这个问题已经得到解答,因为类似的问题困扰了我几天。

public string ModifyScheduledTaskSchedule(string TaskName, string Date, string Hour, string Minute) 
     { 

      string ReturnedTask = TaskName; 


       TaskScheduler.TaskScheduler ts = new TaskScheduler.TaskScheduler(); 

       ts.Connect(PackagingServer, PkgServerUserName, "DOMAIN", PkgServerPassword); 

       IRegisteredTask task = ts.GetFolder("\\").GetTask(TaskName); 

       ITaskDefinition td = task.Definition; 

       td.Triggers[1].StartBoundary = Date + "T" + Hour + ":" + Minute + ":" + "00"; 

       ts.GetFolder("\\").RegisterTaskDefinition(TaskName, td, (int)_TASK_CREATION.TASK_UPDATE, "DOMAIN\\" + PkgServerUserName, PkgServerPassword, _TASK_LOGON_TYPE.TASK_LOGON_NONE, ""); 


      return ReturnedTask; 
     } 

克拉克BOHS

是。您必须创建一个具有相同标题和文件夹的新任务定义才能更新现有任务。尝试注册它并在任务计划程序中查看任务。它应该用新的时间表更新任务。但是,历史应该保持不变。