任务计划程序没有 运行 具有网络路径的任务

Task Scheduler Not Running task with Network Path

我在测试开发环境中工作,我正在使用远程网络位置访问可执行文件的任务计划程序中创建任务。尽管在我的场景中网络地址是我自己的机器。 像这样

\MyComputerName\FolderOnMyPC\application.exe

现在我已经授予了对该文件夹的适当共享访问权限,我可以通过资源管理器访问可执行文件,但是当我在任务计划程序中创建任务时,我无法 运行 它。尽管任务 运行 可以像这样

这样的本地磁盘路径

D:\FolderOnMyPC\application.exe

我已尝试通过 Internet 调查此问题,但我无法找到任何解决方法或它发生的原因,因为即使在

中,我也已经提供了对文件夹的所有可能访问权限

System32/Tasks

还有一些参数在任务计划程序的参数部分指定

已编辑

我正在分享执行任务的代码。

public Task<int> Launch(string Path, string iniFilePath)
        {
            try
            {
                TaskService taskService = new TaskService();

                const string TaskName = "LaunchTask";
                if (taskService.FindTask(TaskName) != null)
                {
                    var task = taskService.FindTask(TaskName);
                }

                iniFilePath = "\"" + iniFilePath + "\"";
                string completeArgument = "/portable /skipupdate " + iniFilePath;
                TaskDefinition taskDefinition = taskService.NewTask();            
                taskDefinition.Principal.LogonType = TaskLogonType.S4U;
                taskDefinition.Actions.Add(new ExecAction(mt4Path, completeArgument, null));                          
                taskDefinition.Settings.Hidden = false;
                Microsoft.Win32.TaskScheduler.Task mtTask = taskService.RootFolder.RegisterTaskDefinition(TaskName, taskDefinition);
                RunningTask runningMT4 = mtTask.Run();
                int processIdMT = (int)runningMT.EnginePID;
                mt4Task.Folder.DeleteTask(mtTask.Name);
                return System.Threading.Tasks.Task.FromResult(processIdMT);
            }
            catch
            {
                throw;
            }
        }

关于该项目的一些额外信息是我正在处理 Service Fabric 项目并将其用作服务。

虽然我可能已经找到了一个可以解决问题的解决方案,但我可能正在尝试研究另一个方向,但希望它能帮助像我这样的其他人。问题出在这一行

taskDefinition.Principal.LogonType = TaskLogonType.S4U;

现在查看有关 msdn 的文档,我发现了我的问题

TASK_LOGON_S4U

Use an existing interactive token to run a task. The user must log on using a service for user (S4U) logon. When an S4U logon is used, no password is stored by the system and there is no access to either the network or encrypted files.

所以我将我的任务登录类型更改为服务帐户并提供了 NETWORKSERVICE 作为用户 ID,它解决了我的问题。 这是附加的更新代码

   public Task<int> Launch(string Path, string iniFilePath)
            {
                try
                {
                    TaskService taskService = new TaskService();

                    const string TaskName = "LaunchTask";
                    if (taskService.FindTask(TaskName) != null)
                    {
                        var task = taskService.FindTask(TaskName);
                    }

                iniFilePath = "\"" + iniFilePath + "\"";
                string completeArgument = "/portable /skipupdate " + iniFilePath;
                TaskDefinition taskDefinition = taskService.NewTask();            
                taskDefinition.Principal.LogonType = TaskLogonType.ServiceAccount;
                taskDefinition.Principal.UserId = @"NT AUTHORITY\NETWORKSERVICE";
                taskDefinition.Actions.Add(new ExecAction(mt4Path, completeArgument, null));                          
                taskDefinition.Settings.Hidden = false;
                Microsoft.Win32.TaskScheduler.Task mtTask = taskService.RootFolder.RegisterTaskDefinition(TaskName, taskDefinition);
                RunningTask runningMT4 = mtTask.Run();
                int processIdMT = (int)runningMT.EnginePID;
                mt4Task.Folder.DeleteTask(mtTask.Name);
                return System.Threading.Tasks.Task.FromResult(processIdMT);
            }
            catch
            {
                throw;
            }
        }

这样做的原因是因为我 运行 在 Service Fabric 项目下,服务结构使用网络服务来启动它的任务。