在Windows任务计划程序中更改已计划任务的运行时间

时间:2011-12-21 15:21:39

标签: c# windows winapi com scheduled-tasks

我在修改机器上已存在的任务时遇到问题。我正在尝试使用C#生成的互操作接口(从system32 / taskschd.dll生成的Interop.TaskScheduler.dll)执行此操作。

首先,我不能使用其他库,例如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);

首先看它应该有效,但出于某种原因,当我尝试为行中分配新的日期时间时:

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

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

3 个答案:

答案 0 :(得分:3)

如果您尝试使用此类任务计划程序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, ...

回复原始海报,请参阅问题评论。我写了这个答案来澄清这个问题,并提请注意这个问题已被回答的问题,因为类似的问题困扰了我几天。

答案 1 :(得分:1)

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;
        }

Clark Bohs

答案 2 :(得分:0)

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