我正在测试开发环境中工作,我正在使用远程网络位置访问可执行文件的任务调度程序中创建任务。虽然在我的场景中,网络地址属于我自己的机器。像这样
\\ 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项目,并将其用作服务。
我试图调查另一个方向,虽然我可能已经找到了一个解决方案,可以非常一个解决方法,但希望它能帮助像我这样的其他人。问题出在这一行
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项目下运行它,并且服务结构正在使用网络服务来启动它的任务。