【WPF】Windowsのタスクスケジューラにタスクを登録する

2017年10月7日C#,開発

おはようございます。

Windows のソフトであれば、
タスクスケジューラを使って何かしたいってこと、あると思います。

のでやってみました。

プログラムは前回のものを流用します。

スポンサーリンク

参照の追加

プログラムからタスクスケジューラを操作するためのライブラリを追加します。

参照の追加

パッケージ・エクスプローラーの「参照」を右クリックし「参照の追加」を選択します。

ライブラリ追加

「COM」を選択し、「task」でフィルタリング、
「TaskScheduler 1.1 Type Library」にチェックをして「OK」ボタンをクリックします。

新規クラス作成

タスク登録用のクラスを追加します。

クラス追加

パッケージ・エクスプローラーでプロジェクトを右クリック、
「追加」>「クラス」を選択します。

クラス名の入力

名前に「TaskManager.cs」と入力して「追加」ボタンをクリックします。

TaskManager.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Reflection;
using TaskScheduler;

namespace WpfApp1
{
    class TaskManager
    {

        public static void RegistTask()
        {

            ITaskService taskservice = null;
            try
            {
                taskservice = new TaskScheduler.TaskScheduler();
                taskservice.Connect(null, null, null, null);
                ITaskFolder rootfolder = null;
                try
                {

                    // アセンブリ情報取得
                    Assembly mainAssembly = Assembly.GetExecutingAssembly();

                    // ソフトウェア名
                    string appName = "-";
                    object[] AppNameArray = mainAssembly.GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
                    if ((AppNameArray != null) && (AppNameArray.Length > 0))
                    {
                        appName = ((AssemblyTitleAttribute)AppNameArray[0]).Title;
                    }

                    // 追加フォルダを指定する
                    rootfolder = taskservice.GetFolder("\\");
                    String path = "\\DORADORA\\" + appName + "(自動実行タスク)";

                    // 新規登録用のタスク定義
                    ITaskDefinition taskDefinition = taskservice.NewTask(0);

                    // RegistrationInfoプロパティ
                    IRegistrationInfo registrationInfo = taskDefinition.RegistrationInfo;

                    // Actionsプロパティ
                    IActionCollection actionCollection = taskDefinition.Actions;
                    IExecAction execAction = (IExecAction)actionCollection.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);

                    // Triggersプロパティ
                    ITriggerCollection triggerCollection = taskDefinition.Triggers;
                    ITimeTrigger timeTrigger = (ITimeTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);

                    // Settingsプロパティ
                    ITaskSettings taskSettings = taskDefinition.Settings;

                    /** 全般タブ */

                    // 作成者
                    registrationInfo.Author = "DORADORA";
                    
                    // 説明
                    registrationInfo.Description = "タスク登録のサンプル";

                    // 主要な設定
                    IPrincipal principal = taskDefinition.Principal;

                    // タスクの実行時に使うユーザアカウント
                    principal.UserId = Environment.UserDomainName + "\\" + Environment.UserName;

                    // ユーザがログオンしているかどうかにかかわらず実行する(パスワードを保存しない(チェックあり))
                    principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_S4U;

                    // 最上位特権で実行する
                    //principal.RunLevel = _TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;

                    // 表示しない
                    taskSettings.Hidden = true;

                    // 優先度
                    taskSettings.Priority = 6;

                    /** トリガタブ */

                    // 開始
                    timeTrigger.StartBoundary = "2017-10-02T00:00:00";
                    
                    // 繰り返し間隔
                    timeTrigger.Repetition.Interval = "PT1H";
                    
                    // 有効
                    timeTrigger.Enabled = true;

                    /** 操作タブ */

                    // 実行フォルダ取得
                    String appDir = System.IO.Path.GetDirectoryName(mainAssembly.Location);

                    // プログラム/スクリプト
                    execAction.Path = appDir + "\\taskSample.vbs";
                    
                    // 引数の追加(オプション)
                    //execAction.Arguments = "引数";
                    
                    // 開始(オプション)
                    execAction.WorkingDirectory = appDir;

                    try
                    {
                        rootfolder.RegisterTaskDefinition(path,
                                                            taskDefinition,
                                                            (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,
                                                            null,
                                                            null,
                                                            _TASK_LOGON_TYPE.TASK_LOGON_NONE,
                                                            null);
                    }
                    catch (System.UnauthorizedAccessException e)
                    {
                        throw e;
                    }
                    catch (System.Exception e)
                    {
                        throw e;
                    }
                }
                finally
                {
                    if (rootfolder != null)
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(rootfolder);
                }
            }
            finally
            {
                if (taskservice != null)
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(taskservice);
            }

        }
    }
}

今回は単純に起動してから
60分(1時間)毎に繰り返し実行するタスクを登録するようにしました。

トリガーの種類

 

インターフェース説明
IEventTriggerシステムイベントが発生したタイミングで開始する
ITimeTrigger特定の日時に開始する
IDailyTrigger日次スケジュールに基づいてタスクを開始するタスクは毎日、1日おき、3日おきなど特定の時刻に開始されます。
IWeeklyTrigger週単位のスケジュールに基づいてタスクを開始する
IMonthlyTrigger毎月のスケジュールに基づいてタスクを開始する
IMonthlyDOWTrigger月曜日の曜日スケジュールでタスクを開始する
IIdleTriggerコンピュータがアイドル状態になったときにタスクを開始する
IRegistrationTriggerタスクが登録されたときにタスクを開始する
IBootTriggerシステムの起動時にタスクを開始する
ILogonTriggerユーザーがログオンしたときにタスクを開始する
ISessionStateChangeTriggerコンソールの接続または切断、リモート接続または切断、またはワークステーションのロックまたはロック解除通知のタスクをトリガーします

各トリガーの使用方法は長くなるので割愛させてください。

プログラム修正

起動時にタスク登録を実行する

コンストラクタに次の記述を追加します。

MainWindow.xaml.cs

// タスクを登録
TaskManager.RegistTask();

実行するバッチの配置

下記のファイルを作成し、実行フォルダに配置します。

taskSample.bat

    @echo off
    
    echo %DATE% %TIME% タスク実行 > task.log
    
    exit /0

taskSample.vbs

    Option Explicit
    
    Dim intReturn
    Dim ws
    Set ws = CreateObject("Wscript.Shell") 
    
    intReturn = ws.run("cmd /c taskSample.bat", 0)
    
    WScript.Quit(intReturn) 

 

起動してみる

タスクスケジューラ

タスクスケジューラ―を起動すると、
無事にタスクが登録されているのが確認できました。

今回はここまで。

ではでは。

スポンサーリンク


関連するコンテンツ

2017年10月7日C#,開発WPF,プログラミング

Posted by doradora