仕事でタスクスケジューラを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);
}
//==================================
日本語の参考物がなかなかなかったので、覚書くらいの感じで…。
まず、操作する方法としては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);
}
//==================================