我有一个需要在 E:/ 驱动器上运行的可执行文件,Windows Server 2012 安装在 C:/ 驱动器上。我创建了一个计划任务,其中包含目标可执行文件的完整路径 (E:/stuff/target.exe),并设置了工作目录 (E:/stuff/)。
这失败了,任务计划程序告诉我目录名称无效。如果我删除工作目录,它会告诉我访问被拒绝。这不可能是对的,整个驱动器都是共享的,并且文件权限设置为“所有人”并具有完全控制权。运行任务的帐户肯定可以运行它(我可以通过 cmd.exe 来运行)。边注:我尝试了路径的所有排列,使用反斜杠、正斜杠、引号和非引号。这不是由于KB2452723。
我尝试过使用批处理文件,使用“CD”将工作目录设置为 E:/stuff/,然后调用该程序,运行时可以正常工作。不幸的是,当通过任务计划程序运行时,它从不更改工作目录,并尝试从系统驱动器(不存在该驱动器)调用 target.exe。
我还尝试从 C:/temp/ 到 E:/stuff/ 创建一个符号链接(“mklink /D”),希望能够欺骗任务调度程序,但是它却不会跟踪该链接,并告诉我找不到该目录。
我不明白为什么任务调度程序会如此努力地反对这一点,也不明白正确的做法是什么才能让它工作。有没有人用任务调度程序成功地运行了非系统驱动器上的文件?
答案1
经过几个小时的苦思冥想,我终于找到了解决方案。看来在 Server 2012 中,计划任务无法触及没有明确允许权限用于运行文件的帐户。该帐户是否属于允许进入目录的组并不重要。
例如,如果我想使用帐户 THINGS\svcAccount 运行 E:/stuff/target.exe,那么 THINGS\svcAccount必须被赋予对 E:/stuff 的明确完全控制权才能运行。我曾假设,如果 THINGS\svcAccount 属于管理员组,并且管理员组对 E:/stuff 具有完全控制权,它将继承权限。Server 2012 不会这样做。
这似乎仅适用于计划任务 - 以 THINGS\svcAccount 为名运行命令窗口或 powershell 窗口完全按照预期工作。
答案2
服务或任务看不到驱动器映射。请改用 UNC 路径。
\\server\share\directory\someprogram.exe
另一个选项是安排运行批处理文件并在其中包含驱动器映射。在批处理文件中,使用推送/弹出进行映射而不必担心它获得什么驱动器号(pushd 可以映射到驱动器号并切换到该驱动器号,popd 可以取消映射并返回到上一个驱动器号)。
pushd \\server\share
\directory\someprogram.exe
popd