如何在 C# 中使用 TaskScheduler 设置“运行 only if logged in”和“运行 as”?
How to set “run only if logged in” and “run as” with TaskScheduler in C#?
我正在尝试使用 c# Task Scheduler Managed Wrapper 以编程方式在 windows 系统上生成计划任务。我可以生成任务,但只有在帐户登录时才能将其发送到 运行:
我一直在四处寻找,发现了去年提出的另一个 SO 问题,但要么有其他未提及的相关设置,要么代码库中的某些内容从那时起发生了变化:
How to set "run only if logged in" and "run as" with TaskScheduler in C#?
我认为这种方法可能是正确的,但是当我尝试它时,我收到了一条令人困惑的错误消息:
Task Scheduler 2.0 (1.2) does not support setting this property. You must use an InteractiveToken in order to have the task run in the current user session.
我使用的代码如下:
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,因此一定还有其他我遗漏的东西。
好的,解决方法是:
注册任务定义调用需要将其 TaskLogonType 设置为交互式令牌。仅将 TaskDefinition Principal 登录类型设置为使用交互式令牌将不起作用。
RunOnlyIfLoggedOn 似乎只适用于早期版本的任务计划程序(v1,在 w2k3 等系统上)
我正在尝试使用 c# Task Scheduler Managed Wrapper 以编程方式在 windows 系统上生成计划任务。我可以生成任务,但只有在帐户登录时才能将其发送到 运行:
我一直在四处寻找,发现了去年提出的另一个 SO 问题,但要么有其他未提及的相关设置,要么代码库中的某些内容从那时起发生了变化:
How to set "run only if logged in" and "run as" with TaskScheduler in C#?
我认为这种方法可能是正确的,但是当我尝试它时,我收到了一条令人困惑的错误消息:
Task Scheduler 2.0 (1.2) does not support setting this property. You must use an InteractiveToken in order to have the task run in the current user session.
我使用的代码如下:
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,因此一定还有其他我遗漏的东西。
好的,解决方法是:
注册任务定义调用需要将其 TaskLogonType 设置为交互式令牌。仅将 TaskDefinition Principal 登录类型设置为使用交互式令牌将不起作用。
RunOnlyIfLoggedOn 似乎只适用于早期版本的任务计划程序(v1,在 w2k3 等系统上)