【C#】タスクスケジューラへの登録

プログラム
スポンサーリンク

仕事をこなしていくタイミングで調べてことをまとめていきます!

・決まった時間に処理をさせたい!
・タスクスケジューラってどうやって設定するの?
・システムから自動で設定したい

スポンサーリンク

タスクスケジューラってなに?

コンピュータプログラムの実行制御システムの一つである。
利用者が指定した時間(スケジュール)/条件を元にプログラムの実行/終了を行ってくれる。
オペレーティングシステム上での特定の コマンド や 実行ファイル の起動や終了などをスケジュールに基づいて自動実行するシステムで、 再起動 や シャットダウン などシステム自身に対する操作を行う。

【C#】タスクスケジューラを登録しよう!

・C#からタスクスケジューラを使用するためにまずLibraryの参照設定をします。
 「プロジェクト」⇒「参照の追加」を選択
 「COM」を選択して、右上の検索窓から「TaskScheduler」を入力
 検索結果に表示される「TaskScheduler 1.1 Type Library」を選択して「OK」を選択で完了!


//変数の宣言
ITaskService taskservice = null;
ITaskFolder taskfolder = null;

try
{
    // TaskServiceを生成して接続する
    taskservice = new TaskScheduler.TaskScheduler();
    // 接続時の serverName User, Domain, Password を必要に応じて設定する
    //「https://docs.microsoft.com/ja-jp/windows/win32/taskschd/taskservice-connect」を参照
    taskservice.Connect(null,null,null,null);

    // タスクスケジューラーのフォルダを指定する
    taskfolder = taskservice.GetFolder("\\");
    var path = @"\SAMPLE\スケジューラ登録テスト";

    // 新規登録用のタスクを定義
    //「https://docs.microsoft.com/ja-jp/windows/win32/taskschd/taskservice-newtask」を参照
    ITaskDefinition taskDefinition = taskservice.NewTask(0);

    // 設定に使うもろもろ
    IRegistrationInfo registrationInfo = taskDefinition.RegistrationInfo;
    IActionCollection actionCollection = taskDefinition.Actions;
    IExecAction execAction = (IExecAction)actionCollection.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
    ITriggerCollection triggerCollection = taskDefinition.Triggers;
    ITimeTrigger timeTrigger = (ITimeTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);
    ITaskSettings taskSettings = taskDefinition.Settings;
    IPrincipal principal = taskDefinition.Principal;

    // タスクの作成者と概要
    taskSettings.ExecutionTimeLimit = "P3D";

    registrationInfo.Author = "こぽちゃ@フリーランス";
    registrationInfo.Description = "タスクスケジューラーに挑戦";

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

    // ユーザがログオンしているかどうかにかかわらず実行
    // 最上位特権で実行する
    principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_S4U;
    principal.RunLevel = _TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;

    // トリガー条件(開始時間、間隔、有効)
    timeTrigger.StartBoundary = "2022-03-21T13:00:00";
    timeTrigger.Repetition.Interval = "PT1H"; // 1時間間隔で実行
    timeTrigger.Enabled = true;

    // 動作確認用のバッチファイルを実行するように設定
    execAction.Path = @"C:\RegistTaskSample\test.bat";

    // 作業ディレクトリをexeのあるパスにしておく
    execAction.WorkingDirectory = @"C:\RegistTaskSample";

    // 登録
    taskfolder.RegisterTaskDefinition(
        path,
        taskDefinition,
        (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,
        null,
        null,
        _TASK_LOGON_TYPE.TASK_LOGON_NONE,
        null
    );
}
catch (Exception ex)
{
    //エラー処理
}
finally
{
    if (taskservice != null)
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(taskservice);
    }
    if (taskfolder != null)
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(taskfolder);
    }
}

「using TaskScheduler」の追加をお忘れなく!

これで、実行してみると登録されるはずなのですがここで、問題が。。。

Windowsのバージョンが上がることによるセキュリティーの問題なのかうまく登録できない場合は
下記のことをしてみてください。

1.VisualStadioを管理者権限で実行してみる
2.Exeからの場合は、プロパティから「管理者としてこのプログラムを実行する」をチェック!

これで、どうにかやりたいことはできそうですが、腑に落ちないですね。
状況を解決できる方法を知っている方、教えてください!お願いします!

コメント

タイトルとURLをコピーしました