情况
我有一个批处理脚本,它准备一些文件,执行一个程序(.exe
),然后删除所述文件。
此任务应每小时运行一次,因此我尝试使用计划任务对其进行配置。问题是,前面提到的程序在从任务调用时无法正常运行(无论是通过脚本.bat
还是直接调用.exe
),但我在日志中没有收到任何警告或错误消息。
设置
该任务配置为以 Windows 服务帐户运行,并且所有权限均已正确设置。使用此帐户通过 RDP 登录时,我可以直接执行.bat
并执行.exe
,没有任何问题,但该任务似乎仍然没有执行任何操作。这很容易观察到,因为程序总是修改文件,并且修改于时间戳不会在任务过程中改变。
在计划任务日志中,我获得了有关任务启动进程、退出等的信息消息。但是,“结果代码”是111
(尝试在 Google 上搜索,但没有成功,我得到的唯一关联是“文件名太长”,据我所知,这完全不相关)。在应用程序日志中,我什么也没得到。
我怀疑问题在于
该程序是一个老旧而又丑陋的程序,它会产生某种启动画面(实际上是一个普通窗口),尽管 GUI 是不需要的,因为它不需要交互,操作后会自动关闭。窗口出现约 2 秒钟。
我怀疑 GUI 的这个要求与任务失败有关,但我不确定。当我以运行任务的用户身份登录时(通过 RDP),启动计划任务时没有出现任何窗口。
编辑 GUI
我构建了一个非常小的 C# 可执行文件,它可以在没有主窗口的情况下启动程序(使用ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden
)。即使这样,计划任务仍然无法成功正确启动程序,但返回代码现在是0
。
更新
当我将任务配置为“无论用户是否登录都运行”时,选项run with highest privileges
是未选中,误差值为2147943859
。
我该如何排除故障?
操作系统 = Windows Server 2008 R2 SP1
如果需要更多信息,请在评论中告诉我。
答案1
我相信你的问题与用于运行任务的帐户的权限有关,或者语境尝试运行任务时,该帐户已存在。
测试控制台会话要求
你的。EXE文件Console
必须在计算机上的会话(又称会话 0)中运行。要测试这一点:
- 配置任务以仅在用户登录时运行并指定任务开始时间为 2 分钟后
- 使用运行任务时所用的相同用户帐户登录到计算机(最好登录到控制台会话,可以亲自登录控制台,也可以使用可以访问控制台的远程访问程序。要确认您正在使用控制台会话,请从命令提示符运行,
QWINSTA
观察该SESSIONNAME
列,并确认>
指示器位于旁边console
,换句话说,它应该显示为>console
) - 等待任务运行
如果任务运行正常,请尝试使用SCHTASKS.EXE
使用/IT
参数。如果失败,您可能别无选择,只能将计算机配置为自动以您的服务用户帐户登录并将该任务作为启动程序运行。
检查权限
此外,正如我已经建议的那样,请检查以下内容以确认用于运行任务的帐户是否获得适当的权限:
- 授予帐户作为批处理作业登录用户权限(可在本地组策略中找到
Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments
) - 确认任务已配置为以最高权限运行
- 确认用户对其必须交互的所有文件夹和文件具有完全 NTFS 权限。不要做任何假设;而是通过导航到这些文件位置并使用
Effective Permissions
文件/文件夹的选项卡进行确认特性在Security > Advanced
要检查/尝试的其他事项
- 该任务是否需要访问网络资源?当您登录使用用户帐户,但根据服务器的配置,从任务计划程序执行时可能不存在于用户帐户的上下文中。
为批处理文件添加一些日志记录。每执行完一行后,让它将一些输出写入日志文件,这样你就知道它在哪里卡住了。例如:
@echo off echo Line 1 >> "C:\MyLog.txt" "C:\My Folder\myOldProgram.exe" echo Line 2 >> "C:\MyLog.txt" DEL somefile.dat echo Line 3 >> "C:\MyLog.txt"
尝试运行。EXE文件例如
START
START "myTitle" "C:\full\path\to\my.EXE"
答案2
我正在回复一篇旧帖子,希望它能帮助到其他人。我遇到了同样的问题。事件日志显示程序正常完成,但甚至连第一行代码都不会写入日志。它最终成为任务计划程序中的“启动于”选项。我突然想到,当我在当前目录中时,该程序从命令行运行良好。同一目录中有清单文件和其他依赖项。因此,如果您告诉计划的作业在与 EXE 相同的目录中启动,您可能会得到有利的结果。这对我来说是解决方案。
答案3
也许这对你有帮助?
我们遇到了类似的问题,而您唯一的解决方案是我们在服务器上创建了一个具有自动登录功能的特殊帐户。因此,如果任务在已登录的用户下运行,我们的 .exe 就可以正常工作……
我知道这不是一个很好的解决方案,但对我们来说,这是唯一有效的方法。我不知道这对您是否有用......(但使用此方法您必须始终检查用户是否真的登录......)
答案4
我尝试使用 Windows 2008 R2 服务器上的任务计划程序启动旧的 VB6 程序。应用程序可以从 exe、通过批处理文件或单击快捷方式运行,但无法从任务计划程序运行。我发现,当将存储在 C:\program files (x86) 目录中的应用程序文件夹中的应用程序配置文件复制到 c:\programdata 上的应用程序文件夹时,计划程序可以正常工作。看来 cmd.exe 从与任务计划程序使用的位置不同的位置应用配置。如果您的应用程序有配置文件,您可以尝试将它们移动到 c:\programdata\application 文件夹。