こちレモ。

サークルやら開発備忘録やら雑記やら色々と。

[C#覚書]タスクスケジューラを操作する

2013-04-29 22:15:25 | 開発
仕事でタスクスケジューラをC#から操作する必要があったのだけど、
日本語の参考物がなかなかなかったので、覚書くらいの感じで…。

まず、操作する方法としてはWMIやらWin32APIやらいくつかあるけど
なにやらビミョーな実装らしい。この辺はググると出るので割愛。
一番やりやすそうなのはCOMのITaskSchedulerを使うみたいだけど、
操作する対象のOSがVista以降の場合はITaskServiceを使う方が
楽であるようだ。

仕事ではWindows Server 2008 R2が対象だったので、ITaskServiceを
使うことにした。

簡単な使い方はざっと書くと以下の通り。

1.参照の追加で「TaskScheduler 1.1 Type Library」を追加
2.usingにTaskSchedulerを追加
3.ITaskServiceインターフェイスを対象にTaskSchedulerをインスタンス化
4.GetFolderで取得対象とするタスクフォルダを指定
5.GetTaskでタスク情報を取得、いっぺんに取りたい場合はGetTasksを使用
6.使ったものを破棄して終了

なかなか簡単に情報の取得が出来て良かった。
タスクの追加とかも行けそうだけど、今回は取得のみの要件だったので割愛。

自分で思い出す用という意味もこめて、基本的な部分のソースはここに載せておく。

//==================================
ITaskService taskservice = null;
try {
  //ConnectメソッドでTaskServiceに接続する
  //接続する権限や対象を変えたい場合はConnectの引数にマシン/ドメイン/アカウント情報を入れる

  taskservice = new TaskScheduler.TaskScheduler();
  taskservice.Connect();
  ITaskFolder rootfolder = null;
  try {
    //TaskSchedulerにもフォルダの概念があるので、情報を取得する対象のフォルダを指定する
    //何も指定しない場合はルートが選択される
    rootfolder = taskservice.GetFolder("");
    IRegisteredTaskCollection tasks = null;
    try {
      StringBuilder sb = new StringBuilder();

      //タスク一覧を取得
      tasks = rootfolder.GetTasks(0);

      //取得した一覧をループでぶん回して情報を取る
      foreach (IRegisteredTask task in tasks) {
        try {
          string TaskName = task.Name;
          int TaskResult = task.LastTaskResult;
          DateTime TaskRunTime = task.LastRunTime;

          sb.AppendLine("=========");
          sb.AppendLine(String.Format("タスク名:{0}", TaskName));
          sb.AppendLine(String.Format("結果:{0}", TaskResult));
          sb.AppendLine(String.Format("実行日時:{0}", TaskRunTime.ToString("yyyy/MM/dd HH:mm:ss")));
          sb.AppendLine("=========");
        } finally {
          if (task != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(task);
        }
      }
      textBox1.Text = sb.ToString();
    } finally {
      if (tasks != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(tasks);
    }
  } finally {
    if (rootfolder != null)
      System.Runtime.InteropServices.Marshal.ReleaseComObject(rootfolder);
  }
} finally {
  if (taskservice != null)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(taskservice);
}
//==================================

最新の画像もっと見る

コメントを投稿