2017-04-24 24 views
2

我想使用c#任務計劃程序託管包裝程序在Windows系統上以編程方式生成計劃任務。我可以生成的任務,但我不能讓它只運行時登錄的帳戶:如何在C#中使用TaskScheduler設置「僅在登錄時運行」和「以...運行」?

enter image description here

我一直環顧四周,我發現有人問另一家去年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,所以必須有其他東西丟失。

回答

1

好有解決方案:

寄存器任務定義調用需要將其TaskLogonType設置爲交互式令牌。只需將TaskDefinition主體登錄類型設置爲使用交互式令牌將不起作用。

RunOnlyIfLoggedOn似乎只適用於早期版本的任務計劃程序(v1,在像w2k3等系統上)

相關問題