【发布时间】: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