【问题标题】:Changing run time of already scheduled tasks in windows task scheduler在 Windows 任务计划程序中更改已计划任务的运行时间
【发布时间】:2023-11-06 23:27:02
【问题描述】:

我在修改机器上已存在的任务时遇到问题。我正在尝试使用从 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 时,它显示了旧值。我做错了什么吗?有没有机会让它工作? :-) 谢谢。

【问题讨论】:

  • 已解决。对于任何有类似问题的人,您必须在修改之前创建任务副本。在获得 IRegisteredTask 后添加这些行。 ITaskDefinition task = ts.NewTask(0); task = oldTask.Definition;
  • 我需要完成相同的任务(更新已计划任务的运行时间),我实现了这个解决方案。第一次执行时它会更新时间。但在第二次,RegisterTaskDefinition 抛出 AccessDeniedException。有人可以帮忙吗?
  • 很难说...通常当用户在哪个应用程序更改任务上运行时没有足够的权限来更改任务定义(即不是本地管理员)。我真的不明白为什么你不能两次更改同一个任务。

标签: c# windows winapi com scheduled-tasks


【解决方案1】:

如果您尝试像这样使用 Task Scheduler 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, ...

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

【讨论】:

    【解决方案2】:
    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;
            }
    

    克拉克·博斯

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        最近更新 更多