Изменение времени выполнения уже запланированных задач в планировщике задач Windows - PullRequest
3 голосов
/ 21 декабря 2011

У меня проблема с изменением задач, которая уже существует на компьютере. Я пытаюсь сделать это с помощью созданных интерфейсов взаимодействия из C # (Interop.TaskScheduler.dll, сгенерированный из system32 / taskschd.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 он изменился, но когда я попытался отладить и создал другой foreach, который печатает значение StartBoundary, он показывает старое значение. Я делаю что-то неправильно? Есть ли шанс заставить его работать? :-) Спасибо.

Ответы [ 3 ]

3 голосов
/ 30 июля 2012

Если вы пытаетесь обновить задачу с помощью API планировщика задач C #, как это, вам нужно объявить новое 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 голос
/ 05 октября 2013
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;
        }

Кларк Боус

0 голосов
/ 07 января 2014

Да.Вы должны создать новое определение задачи с тем же названием и папкой, чтобы обновить существующее.Попробуйте зарегистрировать его и увидеть задачу в планировщике задач.Он должен был обновить задачу с новым графиком.Но история должна остаться прежней.

...