Как установить «запускать только при входе в систему» ​​и «запускать от имени» с помощью TaskScheduler в C#?

Я пытаюсь использовать управляемую оболочку планировщика задач С# для программного создания запланированных задач в системе Windows. Я могу генерировать задачи, но не могу запустить их только при входе в учетную запись:

введите здесь описание изображения

Я искал и нашел еще один вопрос SO, который был задан в прошлом году, но либо есть другие соответствующие настройки, которые не упоминаются, либо с тех пор что-то в базе кода изменилось:

Как настроить запуск только при входе в систему и запуск, как с TaskScheduler в C#?

Я думаю, что этот подход, вероятно, правильный, но когда я пробую его, я получаю запутанное сообщение об ошибке:

Планировщик заданий 2.0 (1.2) не поддерживает настройку этого свойства. Вы должны использовать InteractiveToken, чтобы задача выполнялась в текущем пользовательском сеансе.

Код, который я использую, выглядит следующим образом:

    public static void ScheduleTask(string machineName, string taskName, string taskAccount, string password)
    {
        using (TaskService ts = new TaskService(machineName))
        {
            TaskDefinition td = ts.NewTask();

            td.Principal.RunLevel = TaskRunLevel.Highest;
            td.Principal.UserId = WindowsIdentity.GetCurrent().Name;
            td.Principal.LogonType = TaskLogonType.InteractiveToken;

            td.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew;
            td.Settings.DisallowStartIfOnBatteries = false;
            td.Settings.StopIfGoingOnBatteries = false;
            td.Settings.StartWhenAvailable = true;
            //td.Settings.RunOnlyIfLoggedOn = true;
            td.Settings.Enabled = true;
            td.Settings.Hidden = false;
            td.Settings.AllowHardTerminate = true;
            td.Settings.ExecutionTimeLimit = new TimeSpan();

            var tt = new SessionStateChangeTrigger();
            tt.StartBoundary = DateTime.Now.AddMinutes(1);
            tt.UserId = taskAccount;
            tt.StateChange = TaskSessionStateChangeType.RemoteConnect;
            tt.Repetition.Interval = TimeSpan.FromMinutes(1);
            tt.Repetition.StopAtDurationEnd = false;
            td.Triggers.Add(tt);

            td.Actions.Add("notepad.exe", "c:\\test.log");

            ts.RootFolder.RegisterTaskDefinition(taskName, td, TaskCreation.CreateOrUpdate, taskAccount, password, TaskLogonType.Password, null);
        }
    }

Если я запускаю этот код с действительным сервером, пользователем и т. д., он создает задачу без проблем. Если я прокомментирую параметр «RunOnlyIfLoggedOn», он сгенерирует ошибку, о которой я упоминал ранее. Обратите внимание, что я задаю для свойства LogonType значение TaskLogonType.InteractiveToken, поэтому должно быть что-то еще, что я упускаю.


person Roger Hill    schedule 24.04.2017    source источник


Ответы (1)


Хорошо, есть решение:

Вызов определения задачи регистрации должен иметь для параметра TaskLogonType значение Interactive Token. Просто установка типа входа в систему TaskDefinition для использования интерактивного токена не будет работать.

RunOnlyIfLoggedOn работает только для более ранних версий планировщика задач (v1, в таких системах, как w2k3 и т. д.)

person Roger Hill    schedule 03.05.2017
comment
Я знаю, что это было давно, но не могли бы вы предоставить примеры кода о том, как вы решили эту проблему, пожалуйста. - person bennygenel; 09.07.2018
comment
@bennygenel Я предполагаю это: ts.RootFolder.RegisterTaskDefinition(taskName, td, TaskCreation.CreateOrUpdate, taskAccount, password, TaskLogonType.InteractiveToken, null); - person Pierre Nortje; 12.09.2018