【问题标题】:Task Scheduler Not Running task with Network Path任务计划程序未使用网络路径运行任务
【发布时间】:2018-06-10 20:17:39
【问题描述】:

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

\\MyComputerName\FolderOnMyPC\application.exe

现在我已授予对该文件夹的正确共享访问权限,并且可以通过资源管理器访问可执行文件,但是当我在任务计划程序中创建任务时,我无法运行它。虽然任务在这样的本地磁盘路径下运行良好

D:\FolderOnMyPC\application.exe

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

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

【问题讨论】:

  • 任务调度程序在作为系统运行时无法“看到”网络驱动器,但可以在指定的用户帐户下。
  • 我不确定你想说什么,因为据我所知,它是一个系统进程,应该能够看到网络。对吗?
  • 系统服务帐号看不到网络共享。尝试将其设置为使用具有权限的指定用户帐户运行。系统帐号只能是本地管理员。
  • “系统服务帐户看不到网络共享。”。 - 不对。它应该能够通过 UNC 路径访问共享,如果 the share grants permissions to the machine account,而不是用户。
  • 这不是一个编程问题。您甚至似乎都没有通过任何代码配置任务计划程序(更不用说 C#),但即使您这样做了,问题也与编程无关,而只是与任务计划程序的行为方式有关。任务计划程序不是“主要用于编程的工具”,因此有关使用它的问题不是 Stack Overflow 的主题。

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


【解决方案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 项目下运行它,而 Service Fabric 正在使用网络服务来启动它的任务。

【讨论】:

  • 仅供参考,如果您需要保护对文件或安全对象的访问,通常您不希望授予对每个“网络服务”进程的访问权限。当以“NETWORK SERVICE”或“LOCAL SERVICE”的形式运行任务时,进程 Token 应具有基于任务名称的“NT TASK”SID。如果任务位于文件夹中,请将路径中的反斜杠替换为连字符。例如,名为“Spam\LaunchTask”的任务将在其令牌中具有 SID“NT TASK\Spam-LaunchTask”。一旦创建了服务任务,它的 SID 就会在系统中注册,您可以使用它来授予访问权限,例如通过 icacls.exe 获取文件。
  • @eryksun 是的,我在生产中做了同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多