2014年02月16日

C#によるタスクスケジューラへの登録(その2)

今回は[ITaskFolder::RegisterTaskDefinition]でのタスク登録を実装する。
public void RegisterTaskDefinition()
{
    ITaskService taskservice = null;
    try
    {
        taskservice = new TaskScheduler.TaskScheduler();
        taskservice.Connect(null, null, null, null);
        ITaskFolder rootfolder = null;
        try
        {
            //追加フォルダを指定する
            rootfolder = taskservice.GetFolder("\\");
            String path = "\\Test\\testTask";

            //新規登録用のタスク定義
            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);
            //IEmailAction emailAction = (IEmailAction)actionCollection.Create(_TASK_ACTION_TYPE.TASK_ACTION_SEND_EMAIL);
            //IShowMessageAction showMessageAction = (IShowMessageAction)actionCollection.Create(_TASK_ACTION_TYPE.TASK_ACTION_SHOW_MESSAGE);

            //----------------
            //Triggersプロパティ
            //----------------
            //ITriggerCollection triggerCollection = taskDefinition.Triggers;
            //IEventTrigger eventTrigger = (IEventTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_EVENT);
            //ITimeTrigger timeTrigger = (ITimeTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);
            //IDailyTrigger dailyTrigger = (IDailyTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);
            //IWeeklyTrigger weeklyTrigger = (IWeeklyTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_WEEKLY);
            //IMonthlyTrigger monthlyTrigger = (IMonthlyTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_MONTHLY);
            //IMonthlyDOWTrigger monthlyDOWTrigger = (IMonthlyDOWTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_MONTHLYDOW);
            //IIdleTrigger idleTrigger = (IIdleTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_IDLE);
            //IRegistrationTrigger registrationTrigger = (IRegistrationTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_REGISTRATION);
            //IBootTrigger bootTrigger = (IBootTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_BOOT);
            //ILogonTrigger logonTrigger = (ILogonTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);
            //ISessionStateChangeTrigger sessionStateChangeTrigger = (ISessionStateChangeTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_SESSION_STATE_CHANGE);

            //----------------
            //Settingsプロパティ
            //----------------
            //ITaskSettings taskSettings = taskDefinition.Settings;
            //IIdleSettings idleSettings = taskSettings.IdleSettings;
            //INetworkSettings networkSettings = taskDefinition.Settings.NetworkSettings;

            //******************************************:
            //全般タブ
            //******************************************:
            //作成者
            //registrationInfo.Author = "作成者";
            //説明
            //registrationInfo.Description = "説明";
            //IPrincipal principal = taskDefinition.Principal;
            //タスクの実行時に使うユーザアカウント
            //principal.UserId = "**********";
            //ユーザがログオンしているときのみ実行する
            //principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN;
            //ユーザがログオンしているかどうかにかかわらず実行する(パスワードを保存しない(チェックなし))
            //principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_PASSWORD;
            //ユーザがログオンしているかどうかにかかわらず実行する(パスワードを保存しない(チェックあり))
            //principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_S4U;
            //最上位特権で実行する(チェックなし)
            //principal.RunLevel = _TASK_RUNLEVEL.TASK_RUNLEVEL_LUA;
            //最上位特権で実行する(チェックあり)
            //principal.RunLevel = _TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;
            //表示しない
            //taskSettings.Hidden = false;

            //******************************************:
            //トリガタブ
            //******************************************:
            //---------------------
            //イベントログで定義されたイベント
            //---------------------
            //eventTrigger.Subscription
            //eventTrigger.ValueQueries
            
            //---------------------
            //スケジュールに従う(1回)
            //---------------------
            //開始
            //timeTrigger.StartBoundary = "2014-01-24T22:37:37";
            //遅延時間を指定する
            //timeTrigger.RandomDelay = "PT8H";
            //繰り返し間隔
            //timeTrigger.Repetition.Interval = "PT3H";
            //継続時間
            //timeTrigger.Repetition.Duration = "P2D";
            //繰り返し継続時間の最後に実行中のすべてのタスクを停止する
            //timeTrigger.Repetition.StopAtDurationEnd = true;
            //停止するまでの時間
            //timeTrigger.ExecutionTimeLimit = "PT12H";
            //有効期限
            //timeTrigger.EndBoundary = "2014-01-25T22:37:37";
            //有効
            //timeTrigger.Enabled = false;

            //---------------------
            //スケジュールに従う(毎日)
            //---------------------
            //間隔
            //dailyTrigger.DaysInterval = 2;
            //開始
            //dailyTrigger.StartBoundary = "2014-01-24T22:37:37";
            //遅延時間を指定する
            //dailyTrigger.RandomDelay = "PT8H";
            //繰り返し間隔
            //dailyTrigger.Repetition.Interval = "PT3H";
            //継続時間
            //dailyTrigger.Repetition.Duration = "P2D";
            //繰り返し継続時間の最後に実行中のすべてのタスクを停止する
            //dailyTrigger.Repetition.StopAtDurationEnd = true;
            //停止するまでの時間
            //dailyTrigger.ExecutionTimeLimit = "PT12H";
            //有効期限
            //dailyTrigger.EndBoundary = "2014-01-25T22:37:37";
            //有効
            //dailyTrigger.Enabled = false;

            //---------------------
            //スケジュールに従う(毎週)
            //---------------------
            //間隔
            //weeklyTrigger.WeeksInterval = 3;
            //日曜日〜土曜日
            //weeklyTrigger.DaysOfWeek = 7;
            //開始
            //weeklyTrigger.StartBoundary = "2014-01-24T22:37:37";
            //遅延時間を指定する
            //weeklyTrigger.RandomDelay = "PT8H";
            //繰り返し間隔
            //weeklyTrigger.Repetition.Interval = "PT3H";
            //継続時間
            //weeklyTrigger.Repetition.Duration = "P2D";
            //繰り返し継続時間の最後に実行中のすべてのタスクを停止する
            //weeklyTrigger.Repetition.StopAtDurationEnd = true;
            //停止するまでの時間
            //weeklyTrigger.ExecutionTimeLimit = "PT12H";
            //有効期限
            //weeklyTrigger.EndBoundary = "2014-01-25T22:37:37";
            //有効
            //weeklyTrigger.Enabled = false;

            //---------------------
            //スケジュールに従う(毎月)- 日
            //---------------------
            //月
            //monthlyTrigger.MonthsOfYear = 7;
            //日
            //monthlyTrigger.DaysOfMonth = 1;
            //開始
            //monthlyTrigger.StartBoundary = "2014-01-24T22:37:37";
            //遅延時間を指定する
            //monthlyTrigger.RandomDelay = "PT8H";
            //繰り返し間隔
            //monthlyTrigger.Repetition.Interval = "PT3H";
            //継続時間
            //monthlyTrigger.Repetition.Duration = "P2D";
            //繰り返し継続時間の最後に実行中のすべてのタスクを停止する
            //monthlyTrigger.Repetition.StopAtDurationEnd = true;
            //停止するまでの時間
            //monthlyTrigger.ExecutionTimeLimit = "PT12H";
            //有効期限
            //monthlyTrigger.EndBoundary = "2014-01-25T22:37:37";
            //有効
            //monthlyTrigger.Enabled = false;

            //---------------------
            //スケジュールに従う(毎月)- 曜日
            //---------------------
            //月
            //monthlyDOWTrigger.MonthsOfYear = 1;
            //週
            //monthlyDOWTrigger.WeeksOfMonth = 7;
            //曜日
            //monthlyDOWTrigger.DaysOfWeek = 1;
            //開始
            //monthlyDOWTrigger.StartBoundary = "2014-01-24T22:37:37";
            //遅延時間を指定する
            //monthlyDOWTrigger.RandomDelay = "PT8H";
            //繰り返し間隔
            //monthlyDOWTrigger.Repetition.Interval = "PT3H";
            //継続時間
            //monthlyDOWTrigger.Repetition.Duration = "P2D";
            //繰り返し継続時間の最後に実行中のすべてのタスクを停止する
            //monthlyDOWTrigger.Repetition.StopAtDurationEnd = true;
            //停止するまでの時間
            //monthlyDOWTrigger.ExecutionTimeLimit = "PT12H";
            //有効期限
            //monthlyDOWTrigger.EndBoundary = "2014-01-25T22:37:37";
            //有効
            //monthlyDOWTrigger.Enabled = false;

            //---------------------
            //アイドル時
            //---------------------
            //なし

            //---------------------
            //タスクの登録/変更時
            //---------------------
            //開始
            //registrationTrigger.StartBoundary = "2014-01-24T22:37:37";
            //繰り返し間隔
            //registrationTrigger.Repetition.Interval = "PT3H";
            //継続時間
            //registrationTrigger.Repetition.Duration = "P2D";
            //繰り返し継続時間の最後に実行中のすべてのタスクを停止する
            //registrationTrigger.Repetition.StopAtDurationEnd = true;
            //停止するまでの時間
            //registrationTrigger.ExecutionTimeLimit = "PT12H";
            //有効期限
            //registrationTrigger.EndBoundary = "2014-01-25T22:37:37";
            //有効
            //registrationTrigger.Enabled = false;

            //---------------------
            //スタートアップ時
            //---------------------
            //なし

            //---------------------
            //ログオン時
            //---------------------
            //logonTrigger.UserId = "**********";

            //---------------------
            //ユーザセッションからの接続時
            //---------------------
            //ローカルコンピュータからの接続
            //sessionStateChangeTrigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_CONSOLE_CONNECT;
            //リモートコンピュータからの接続
            //sessionStateChangeTrigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_REMOTE_CONNECT;
            //特定のユーザー/グループ
            //sessionStateChangeTrigger.UserId = "**********";

            //---------------------
            //ユーザセッションからの切断時
            //---------------------
            //ローカルコンピュータからの接続
            //sessionStateChangeTrigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_CONSOLE_DISCONNECT;
            //リモートコンピュータからの接続
            //sessionStateChangeTrigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_REMOTE_DISCONNECT;
            //特定のユーザー/グループ
            //sessionStateChangeTrigger.UserId = "**********";

            //---------------------
            //ワークステーションロック時
            //---------------------
            //sessionStateChangeTrigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_SESSION_LOCK;
            //特定のユーザー/グループ
            //sessionStateChangeTrigger.UserId = "**********";

            //---------------------
            //ワークステーションアンロック時
            //---------------------
            //sessionStateChangeTrigger.StateChange = _TASK_SESSION_STATE_CHANGE_TYPE.TASK_SESSION_UNLOCK;
            //特定のユーザー/グループ
            //sessionStateChangeTrigger.UserId = "**********";

            //******************************************:
            //操作タブ
            //******************************************:
            //---------------------
            //プログラムの開始
            //---------------------
            //プログラム/スクリプト
            //execAction.Path = "スクリプト.exe";
            //引数の追加(オプション)
            //execAction.Arguments = "引数";
            //開始(オプション)
            //execAction.WorkingDirectory = "開始オプション";

            //---------------------
            //電子メール送信
            //---------------------
            //差出人
            //emailAction.From = "差出人";
            //送信先
            //emailAction.To = "送信先";
            //件名
            //emailAction.Subject = "件名";
            //テキスト
            //emailAction.Body = "テキスト";
            //SMTPサーバー
            //emailAction.Server = "SMTPサーバー";

            //---------------------
            //メッセージの表示
            //---------------------
            //タイトル
            //showMessageAction.Title = "タイトル";
            //メッセージ
            //showMessageAction.MessageBody = "メッセージ";

            //******************************************:
            //条件タブ
            //******************************************:
            //タスクを開始するまでのコンピュータのアイドル時間
            //taskSettings.RunOnlyIfIdle = true;
            //タスクを開始するまでのコンピュータのアイドル時間
            //idleSettings.IdleDuration = "PT5M";
            //アイドル状態にするまでの時間
            //idleSettings.WaitTimeout = "PT1H";
            //コンピュータがアイドル状態でない場合は停止する
            //idleSettings.StopOnIdleEnd = true;
            //再びアイドル状態になったら再起動する
            //idleSettings.RestartOnIdle = false;

            //コンピュータをAC電源で使用してる場合のみタスクを開始する
            //taskSettings.DisallowStartIfOnBatteries = true;
            //コンピュータの電源をばっているに切り替える場合は停止する。
            //taskSettings.StopIfGoingOnBatteries = false;
            //タスクの実行時にスリープを解除する
            //taskSettings.WakeToRun = true;

            //次のネットワーク接続が使用可能な場合のみタスクを開始する
            //taskSettings.RunOnlyIfNetworkAvailable = true;
            //networkSettings.Name = "ネットワーク";

            //******************************************:
            //設定
            //******************************************:
            //タスクを要求時に実行する
            //taskSettings.AllowDemandStart = true;
            //スケジュールされた時刻にタスクを開始できなかった場合、すぐにタスクを実行する
            //taskSettings.StartWhenAvailable = true;
            //タスクが失敗した場合の再起動の間隔
            //taskSettings.RestartInterval = "PT1M";
            //再起動試行の最大数
            //taskSettings.RestartCount = 3;
            //タスクを停止するまでの時間
            //taskSettings.ExecutionTimeLimit = "P1D";
            //要求時に実行中のタスクが終了しない場合、タスクを強制的に停止るする
            //taskSettings.AllowHardTerminate = true;
            //タスクが再度実行するようにスケジュールされていない場合に削除されるまでの時間               
            //taskSettings.DeleteExpiredTaskAfter = "P30D";
            //タスクがすでに実行中の場合に適用される規則
            //新しいインスタンスを開始しない
            //taskSettings.MultipleInstances = _TASK_INSTANCES_POLICY.TASK_INSTANCES_IGNORE_NEW;
            //新しいインスタンスを並列で実行
            //taskSettings.MultipleInstances = _TASK_INSTANCES_POLICY.TASK_INSTANCES_PARALLEL;
            //新しいインスタンスをキューに追加
            //taskSettings.MultipleInstances = _TASK_INSTANCES_POLICY.TASK_INSTANCES_QUEUE;
            //既存のインスタンスの停止
            //taskSettings.MultipleInstances = _TASK_INSTANCES_POLICY.TASK_INSTANCES_STOP_EXISTING;
            
            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);
    }
}
※トリガのイベントログで定義されたイベントについては調査中につき未実装
※電子メール送信アクションの添付ファイルについては、サポートされなくなった(?)らしいので未実装
http://msdn.microsoft.com/en-us/library/windows/desktop/aa380694(v=vs.85).aspx
posted by Tzedeck at 20:30| Comment(0) | IT関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。