2017-04-24 330 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等系统上)

相关问题