誰かがこれが重複していると言う前に、私はすでに ここ 、 ここ 、 ここ 、 ここ 、そしていくつかをチェックしました MSタスクスケジューラクラスのドキュメント を含む他のリソースの。
開発中のC#プログラムを使用して、サーバー上のスケジュールされたタスクを一覧表示できるようにしたかったのです。いくつかの提案されたschtasks.exeMSプログラム、他の サードパーティライブラリ 、これは古く、.NET Framework 2.0でのみ機能しているように見え、他の MSタスクスケジューラクラス 、保護する必要があり、まだいくつかの例を見ていないので、その使用方法を理解しています。また、C:\ Windows\System32\Tasksフォルダーの下にある各リモートマシンのXMLファイルを読み取ることを提案する人もいます。
私の質問は次のとおりです。Windowsのタスクは、VS組み込みクラスを使用して操作するのが難しいですか?マシンですでにスケジュールされているタスクを一覧表示するような(一種の)ばかげたことをするために、フープを飛び越える必要がありますか?
ありがとうございました、
編集:
最終的にProcessクラスを使用し、すべてのサーバーに対してschtasks.exeを開始しました。私が探していたものとは異なりますが、機能します。誰かがコードを必要としているなら、私に一行ドロップして、ここに投稿してください。ありがとう。
ああ、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
}
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("\\"));
}
C#コード内でPowerShellを使用してみませんか? アプリケーションにPowerShellを実装するには、これを参照してください。
また、PowerShellを使用してPC /サーバーでスケジュールされたタスクを見つけるには、 これを行うためのリンクは次のとおりです。
C#アプリでPowerShell出力を読み取るとともに、両方を組み合わせて、Voila。