我想使用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,所以必須有其他東西丟失。