仕事をこなしていくタイミングで調べてことをまとめていきます!
・決まった時間に処理をさせたい!
・タスクスケジューラってどうやって設定するの?
・システムから自動で設定したい
タスクスケジューラってなに?
コンピュータプログラムの実行制御システムの一つである。
利用者が指定した時間(スケジュール)/条件を元にプログラムの実行/終了を行ってくれる。
オペレーティングシステム上での特定の コマンド や 実行ファイル の起動や終了などをスケジュールに基づいて自動実行するシステムで、 再起動 や シャットダウン などシステム自身に対する操作を行う。
【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からの場合は、プロパティから「管理者としてこのプログラムを実行する」をチェック!
これで、どうにかやりたいことはできそうですが、腑に落ちないですね。
状況を解決できる方法を知っている方、教えてください!お願いします!
コメント