我想使用c#任务计划程序托管包装程序在Windows系统上以编程方式生成计划任务。我可以生成的任务,但我不能让它只运行时登录的帐户:如何在C#中使用TaskScheduler设置“仅在登录时运行”和“以...运行”?
我一直环顾四周,我发现有人问另一家去年SO问题,但无论是有未提到的其他相关设置,或在一些代码库自那时以来已经改变:
How to set "run only if logged in" and "run as" with TaskScheduler in C#?
我觉得这种做法是可能是正确的,但是当我尝试它,我得到一个令人困惑的错误消息:
Task Scheduler 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);
}
}
如果我有一个有效的服务器,用户等它生成一个任务W/O问题运行这段代码。如果我在'RunOnlyIfLoggedOn'参数中发表评论,它会生成我前面提到的错误。请注意,我将LogonType属性设置为TaskLogonType.InteractiveToken,所以必须有其他东西丢失。