web-dev-qa-db-ja.com

C#でスケジュールされたタスクを一覧表示する方法

誰かがこれが重複していると言う前に、私はすでに ここここここここ 、そしていくつかをチェックしました MSタスクスケジューラクラスのドキュメント を含む他のリソースの。

開発中のC#プログラムを使用して、サーバー上のスケジュールされたタスクを一覧表示できるようにしたかったのです。いくつかの提案されたschtasks.exeMSプログラム、他の サードパーティライブラリ 、これは古く、.NET Framework 2.0でのみ機能しているように見え、他の MSタスクスケジューラクラス 、保護する必要があり、まだいくつかの例を見ていないので、その使用方法を理解しています。また、C:\ Windows\System32\Tasksフォルダーの下にある各リモートマシンのXMLファイルを読み取ることを提案する人もいます。

私の質問は次のとおりです。Windowsのタスクは、VS組み込みクラスを使用して操作するのが難しいですか?マシンですでにスケジュールされているタスクを一覧表示するような(一種の)ばかげたことをするために、フープを飛び越える必要がありますか?

ありがとうございました、

編集:

最終的にProcessクラスを使用し、すべてのサーバーに対してschtasks.exeを開始しました。私が探していたものとは異なりますが、機能します。誰かがコードを必要としているなら、私に一行ドロップして、ここに投稿してください。ありがとう。

6
Adriano_Pinaffo

ああ、System.Threading.TaskSchedulerは、プロセス内のワークユニットをスケジュールするためのものであり、管理ツールから作成できるスケジュールされたタスクとは関係ありません。

私は https://taskscheduler.codeplex.com/ のようなライブラリを使用します-グーグルで見つけました。2004年のひどいCOMラッパーで、更新するつもりだったのと同じようなことをします。スケジュールされたタスクの内容を簡単に確認できます。

例えば。 「すべてのタスクを列挙する」の例から

void EnumAllTasks()
{
   using (TaskService ts = new TaskService())
      EnumFolderTasks(ts.RootFolder);
}

void EnumFolderTasks(TaskFolder fld)
{
   foreach (Task task in fld.Tasks)
      ActOnTask(task);
   foreach (TaskFolder sfld in fld.SubFolders)
      EnumFolderTasks(sfld);
}

void ActOnTask(Task t)
{
   // Do something interesting here
}
6
dsolimano

Visual Studioで、COM\Type Librariesに参照を追加します:TaskScheduler

taskschd APIを使用します: https://docs.Microsoft.com/en-us/windows/desktop/api/taskschd

これは私がそれをしている方法の例です:

ローカルアカウントと管理者アカウントのどちらでコードを実行しているかに応じて、アクセス許可を持つタスクを取得します。

私の解決策は、サーバーで実行されているローカルシステムアカウントを持つWindowsサービスでこれを行うことでした。

using TaskScheduler;

void ProcessTaskFoler (ITaskFolder taskFolder)
{
    int idx;
    string name, path;
    _TASK_STATE state;

    IRegisteredTaskCollection taskCol = taskFolder.GetTasks((int)_TASK_ENUM_FLAGS.TASK_ENUM_HIDDEN);  // include hidden tasks, otherwise 0
    for (idx = 1; idx <= taskCol.Count; idx++)  // browse al tasks in folder
    {
        IRegisteredTask runTask = taskCol[idx];  // 1 based index

        name = runTask.Name;
        path = runTask.Path;
        state = runTask.State;
        // retrieve other properties...

        Console.WriteLine(path);
    }

    ITaskFolderCollection taskFolderCol = taskFolder.GetFolders(0);  // 0 = reserved for future use
    for (idx = 1; idx <= taskFolderCol.Count; idx++)  // recursively browse subfolders
        ProcessTaskFoler(taskFolderCol[idx]);  // 1 based index
}

void ParseScheduleTasks()
{
    ITaskService taskService = new TaskScheduler.TaskScheduler();
    taskService.Connect();

    ProcessTaskFoler(taskService.GetFolder("\\"));
}
3
Vic_HT

C#コード内でPowerShellを使用してみませんか? アプリケーションにPowerShellを実装するには、これを参照してください。

また、PowerShellを使用してPC /サーバーでスケジュールされたタスクを見つけるには、 これを行うためのリンクは次のとおりです。

C#アプリでPowerShell出力を読み取るとともに、両方を組み合わせて、Voila。

1
Ryan C