如何使用“无论用户是否登录都运行”在任务计划中创建任务

问题描述 投票:0回答:4

并且还详细告诉我“无论用户是否登录都运行”。以避免将来运行创建的任务时出现障碍(有关用户名和密码的详细信息)

c# scheduled-tasks
4个回答
5
投票

您可以将 UserId 设置为

SYSTEM
,它会自动设置选项“无论用户是否登录都运行”。

using (TaskService ts = new TaskService())
{
    var newTask = ts.NewTask();
    newTask.Principal.UserId = "SYSTEM";
    newTask.Triggers.Add(new TimeTrigger(DateTime.Now));
    newTask.Actions.Add(new ExecAction("notepad"));
    ts.RootFolder.RegisterTaskDefinition("NewTask", newTask);
}

执行上述代码的程序必须以管理员身份运行。

在此处的评论中找到了此解决方案,http://taskscheduler.codeplex.com/wikipage?title=Examples


5
投票

要在

taskscheduler
中创建任务并设置:“无论用户是否登录都运行”,请使用以下代码:

var taskDefinition = taskService.NewTask();
taskDefinition.RegistrationInfo.Author = WindowsIdentity.GetCurrent().Name;

taskDefinition.RegistrationInfo.Description = "Runs Application";

// TaskLogonType.S4U = run wether user is logged on or not 
taskDefinition.Principal.LogonType = TaskLogonType.S4U; 

var action = new ExecAction(path, arguments);
taskDefinition.Actions.Add(action);
taskService.RootFolder.RegisterTaskDefinition("NameOfApplication", taskDefinition);

注意: 我在这里不使用触发器。您可以使用以下代码直接从代码启动创建的任务:

//get task:
var task = taskService.RootFolder.GetTasks().Where(a => a.Name == "NameOfApplication").FirstOrDefault();

try
{
    task.Run();
}
catch (Exception ex)
{
    log.Error("Error starting task in TaskSheduler with message: " + ex.Message);
}

3
投票
ITaskFolder rootFolder = taskService.GetFolder(@"\");
rootFolder.RegisterTaskDefinition(taskName, 
                                  taskDefinition,
                                  (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,
                                  null,
                                  null, 
                                  _TASK_LOGON_TYPE.TASK_LOGON_S4U,
                                  null);

我只是尝试使用所有_TASK_LOGON_TYPE,发现“TASK_LOGON_S4U”适用于设置无论用户是否登录都运行。 有关 TaskScheduler 的详细信息 http://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx


0
投票

我发现所有接受的答案都不适合我,但从 Ephedra 和 Despertar 那里汲取想法最终让我实现了目标

让任务作为“系统”运行是解决方案,但仅将 UserId 设置为“SYSTEM”没有任何作用。我还必须设置 LogonType 以匹配系统上下文。

public static void RegisterTask(string exeFile, string name, string arguments, string description = "[my app name] Registered Task")
{
    using (var ts = new Microsoft.Win32.TaskScheduler.TaskService())
    {
        Microsoft.Win32.TaskScheduler.TaskDefinition td = ts.NewTask();
        td.RegistrationInfo.Description = description;
        td.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest;
        td.Principal.UserId = "SYSTEM";
        td.Principal.LogonType = Microsoft.Win32.TaskScheduler.TaskLogonType.ServiceAccount;

        td.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(exeFile, arguments, null));
        ts.RootFolder.RegisterTaskDefinition(name, td);
    }
}

以上对我来说效果很好。希望它可以帮助任何其他想知道这里希望进行远程托管服务更新的人。

© www.soinside.com 2019 - 2024. All rights reserved.