2011-12-21 75 views
3

我在修改機器上已存在的任務時遇到問題。我試圖用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

回答

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

0

是。您必須創建一個具有相同標題和文件夾的新任務定義才能更新現有任務。嘗試註冊它並在任務計劃程序中查看任務。它應該用新的時間表更新任務。但是,歷史應該保持不變。