Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "Как прочитать эти файлы в планировщике задач"

Answer 871220

Link

Вместо того, чтобы парсить XML, лучше воспользоваться библиотекой COM-объектов планировщика задач. Она должна быть в составе ОС по крайней мере начиная с Windows 7.

//Reference: COM -> Task scheduler 1.1 type library
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Runtime.InteropServices;
using TaskScheduler;

...       

static void PrintFolder(ITaskFolder folder) //метод для рекурсивного обхода каталогов
{
    IRegisteredTaskCollection coll = null;
    ITaskDefinition def = null;
    ITaskFolderCollection folders = null;
    IExecAction exec = null;

    try
    {
        coll = folder.GetTasks(0); //найдем задачи в каталоге

        foreach (IRegisteredTask item in coll)
        {
            if (def != null) { Marshal.ReleaseComObject(def); def = null; }
            if (exec != null) { Marshal.ReleaseComObject(exec); exec = null; }

            def = item.Definition;
            bool autostart = false;

            foreach (ITrigger trig in def.Triggers)
            {
                //нас интересуют только задачи, запускающиеся при включении или входе пользователя
                if (trig.Type == _TASK_TRIGGER_TYPE2.TASK_TRIGGER_BOOT ||
                    trig.Type == _TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON)
                {
                    autostart = true; break;
                }
            }

            if (autostart)
            {
                //выведем информацию о задаче
                Console.Write( item.Name + " ");
                foreach (IAction act in def.Actions)
                {
                    if (act.Type != _TASK_ACTION_TYPE.TASK_ACTION_EXEC)
                    {
                        Console.Write( "(" + act.Type.ToString() + ")");
                    }
                    else
                    {
                        exec = (IExecAction)act;
                        //выведем командную строку, запускаемую задачей
                        Console.Write( "(" + exec.Path + " " + exec.Arguments + ")");
                    }
                }
                Console.WriteLine();
            }
        }

        //обходим подкаталоги текущего каталога
        folders = folder.GetFolders(0);
        foreach (ITaskFolder item in folders)
        {
            PrintFolder(item);
        }
    }
    finally
    {
        if (coll != null) Marshal.ReleaseComObject(coll);
        if (def != null) Marshal.ReleaseComObject(def);
        if (folders != null) Marshal.ReleaseComObject(folders);
        if (exec != null) Marshal.ReleaseComObject(exec);
    }
}

public static void PrintTasks() 
{
    TaskScheduler.TaskScheduler ts = null;
    ITaskService its = null;
    ITaskFolder folder = null;

    try
    {
        ts = new TaskScheduler.TaskScheduler();
        its = (ITaskService)ts;

        //подключаемся к локальной машине
        its.Connect();

        //получаем корневой каталог задач
        folder = its.GetFolder("\\");                

        //рекурсивно выводим задачи
        PrintFolder(folder);
    }
    finally
    {
        if (folder != null) Marshal.ReleaseComObject(folder);
        if (its != null) Marshal.ReleaseComObject(its);
        if (ts != null) Marshal.ReleaseComObject(ts);
    }
}

Content is retrieved from StackExchange API.

Auto-generated by ruso-archive tools.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX