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

时间:2017-12-30 23:23:59

标签: c# windows scheduled-tasks azure-service-fabric taskscheduler

我正在测试开发环境中工作,我正在使用远程网络位置访问可执行文件的任务调度程序中创建任务。虽然在我的场景中,网络地址属于我自己的机器。 喜欢这个

  

\\ MyComputerName \ FolderOnMyPC \ application.exe

现在我已经给了文件夹正确的共享访问权限,我可以通过资源管理器访问可执行文件但是当我在任务计划程序中创建任务时,我无法运行它。虽然该任务可以正常使用本地磁盘路径

  

d:\ FolderOnMyPC \ application.exe

我已尝试通过互联网查看此内容,但我无法找到任何解决方法或其发生的原因,因为即使在

中我已尽可能访问文件夹
  

System32下/任务

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

被修改

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

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项目,并将其用作服务。

1 个答案:

答案 0 :(得分:1)

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

taskDefinition.Principal.LogonType = TaskLogonType.S4U;

现在看到msdn上的文档,我发现了我的问题

  

<强> TASK_LOGON_S4U

     

使用现有的交互式令牌来运行任务。用户必须登录   使用服务进行用户(S4U)登录。使用S4U登录时,没有   密码由系统存储,无法访问   网络或加密文件。

所以我将我的任务登录类型更改为服务帐户并提供了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项目下运行它,并且服务结构正在使用网络服务来启动它的任务。