2011-12-21 26 views
3

マシンに既に存在するタスクの変更に問題があります。私はC#(interop.TaskScheduler.dll system32/taskschd.dllから生成)から生成されたinteropのインターフェイスでこれをしようとしています。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); 

を最初の一見のために、それが動作するはずが、私はラインでの実行のために新しい日時を割り当てよう何らかの理由:

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

それは動作しません。 。実際にはforeachでは変更されましたが、デバッグしようとしたときにStartBoundaryの値を出力する別のforeachを作成すると、古い値が表示されます。間違っていることをしていますか?それを稼働させる機会はありますか? :-) ありがとうございました。

+2

解決済み。同様の問題を抱えている人は、変更する前にタスクのコピーを作成する必要があります。 IRegisteredTaskの取得後にこれらの行を追加します。 'ITaskDefinitionタスク= ts.NewTask(0); task = oldTask.Definition; ' – mariozski

+0

私は同じタスク(既にスケジュールされたタスクの実行時間を更新する)を達成する必要があり、私はこのソリューションを実装しました。最初に実行されると時刻が更新されます。しかし、2回目にRegisterTaskDefinitionはAccessDeniedExceptionをスローします。誰か助けてもらえますか? – Dash

+0

言うことは難しいです...通常、これは、アプリケーションの変更タスクが実行されているユーザーがタスクの定義を変更するための十分な権限を持っていない場合(つまりローカル管理者ではない場合)にスローされます。同じ仕事を二度変えることができなかった理由は本当にわかりません。 – mariozski

答えて

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

はい。同じタイトルとフォルダを持つ新しいタスク定義を作成して、既存のタスク定義を更新する必要があります。登録し、タスクスケジューラのタスクを参照してください。新しいスケジュールでタスクを更新しているはずです。しかし、歴史は変わらないはずです。

関連する問題