程序无法按计划任务正常运行


12

情况

我有一个批处理脚本,该脚本准备一些文件,执行程序(.exe),然后删除所述文件。

该任务应该每小时运行一次,因此我正在尝试使用“计划任务”进行配置。问题是,从任务中调用时(既不是通过.bat脚本,也不是.exe直接调用),上述程序无法正常运行,但是日志中没有任何警告或错误消息。

设定

该任务被配置为作为Windows服务帐户运行,该帐户具有正确设置的所有特权。使用此帐户通过RDP登录时,我可以直接执行.bat.exe,而不会出现问题,但任务似乎仍然无能为力。这是很容易观察到,因为程序总是修改文件,并修改上的时间戳通过任务不会改变。

在计划的任务日志中,我获得了有关任务启动过程,退出过程等的信息消息。但是,“结果代码”是111((如果没有运气,请尝试使用Google,我得到的唯一关联是“文件名太长”,这与AFAIK完全无关)。在应用程序日志中,我什么也没得到。

我怀疑是问题所在

该程序是一个古老的怪兽,它生成某种形式的启动屏幕(实际上是一个普通的窗口),尽管不需要GUI是因为它不需要交互并且在操作后会自行关闭。窗口出现约2秒钟。

我怀疑对GUI的这种要求与任务失败有关,但是我不确定。当我与运行任务的用户(通过RDP)登录时,启动计划任务时没有窗口出现。


编辑关于GUI

我已经构建了一个非常小的C#可执行文件,它在没有主窗口的情况下启动程序(使用ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden)。即使这样,计划任务仍然无法成功启动程序,但是现在返回代码为0


更新资料

当我将任务配置为说“运行用户是否已登录”并且未选中run with highest privileges选项时,错误值为。2147943859


我该怎么做排除故障?

操作系统= Windows Server 2008 R2 SP1

如果需要更多信息,请在评论中让我知道。


您的脚本和“程序”是否接受任何输入,例如选项或参数?您是否尝试使用PowerShell而不是批处理?当从.exe脚本中使用参数启动“程序”时,必须正确提供输入作为参数。
slybloty 2014年

1
您是否尝试过使用其他程序进行调度程序?只需将一个程序替换为另一个程序,然后看看会得到什么结果。
slybloty 2014年

2
@ out-null我不认为任务计划程序使用窗口来知道程序何时完成运行,它应该等待该过程,无论它对Windows做什么。但是,如果程序尝试寻找特定的东西来创建其启动屏幕(假设任务栏)而找不到它(因为它在单独的桌面/窗口站上运行),则可能会停止...
Ale 2014年

1
好。您是否尝试过使用LocalSystem帐户运行它?另外,您是否尝试过使用Sysinternals的Process Monitor监视进程启动事件?
幸运卢克

1
@BradBouchard即使在这种特定情况下您的答案可能无法解决OP的问题,它还是有效的答案,对以后访问SF的访问者可能很有用,因此,我建议您不要删除它。
我说恢复莫妮卡2014年

Answers:


6

我相信您的问题与用于运行任务的帐户的权限有关,或者与尝试运行任务时所存在的帐户的上下文有关。

测试控制台会话要求

您的.EXE可能必须Console在计算机上的会话(即会话0)中运行。要对此进行测试:

  1. 将任务配置为仅在用户登录后才运行,并指定未来2分钟的任务开始时间
  2. 使用用于运行任务的用户帐户登录计算机(最好是登录控制台会话,方法是物理上位于控制台上,或者使用可访问控制台的远程访问程序。要确认您正在使用控制台会话,从命令提示符运行开始QWINSTA,观察该SESSIONNAME列,并确认>指示器位于旁边console,换句话说,它应显示为>console
  3. 等待任务运行

如果任务正常运行,请尝试SCHTASKS.EXE使用/IT参数计划任务。否则,您可能别无选择,只能将计算机配置为以您的服务用户帐户自动登录并以启动程序运行任务。

检查权限

此外,正如我已经建议的那样,请检查以下内容以确认用于运行任务的帐户已获得适当的权限:

  1. 授予该帐户“ 作为批处理作业登录”用户权限(在的本地组策略中找到Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments
  2. 确认任务已配置为以最高特权运行
  3. 确认用户对必须与之交互的所有文件夹和文件具有完全的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"
    
  • 尝试运行你的.EXESTART,例如START "myTitle" "C:\full\path\to\my.EXE"


2

我正在回应一个旧帖子,以防它对其他人有帮助。我遇到过同样的问题。事件日志表明程序正常完成,但是即使第一行代码也不会为我写入日志。它最终成为了任务计划程序中的“开始于”选项。我想到当我在当前目录中时,该程序可以从命令行正常运行。在同一目录中有清单文件和其他依赖项。因此,如果告诉计划的作业与EXE在同一目录中启动,则可能会得到满意的结果。这是我的解决方案。


这是用于运行在Visual Studio中开发的带有支持配置文件的自定义控制台应用程序的解决方案。
billfredtom

1

也许这对您有帮助?

/programming/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-requires-a-user-to-be

我们有一个类似的问题,您唯一的解决方案是使用自动登录功能在服务器上创建一个特殊帐户。因此,如果任务在已经登录的用户下运行,则我们的.exe可以正常运行...

我知道这不是一个很好的解决方案,但对我们来说,这是唯一有效的方法。我不知道这是否对您有用...(但是随着这项工作的进行,您必须检查用户是否一直一直在登录...)


当任务运行所在的用户有效地登录(通过RDP)时,该任务甚至无法正常运行。我使用服务帐户通过RDP登录,手动启动任务,但没有看到窗口出现。
MarioDS 2014年

2
您是否未选中“以最高特权运行”选项?我认为,当您选中此选项时,将发生权限消失(UAC),即使用户登录,您也不会看到窗口(将在没有窗口的单独会话中调用,并且将失败)。也尝试选择选项“配置为”->“ Windows Server 2003,Windows XP或Windows 2000”。
frupfrup 2014年

这似乎没有什么区别,除了现在我设置为“无论用户是否登录运行”时,我都会收到错误代码2147943859。我只能将“配置为”设置为Windows Vista/Windows Server 2008Windows 7/Windows Server 2008 R2。似乎没有什么区别。
MarioDS 2014年

好。最后一个测试:使用“创建新任务”而不是“创建简单任务”创建一个新任务(我不知道真正显示的是什么文本-我的服务器是德语的-但我希望您知道我的意思。)然后我认为您可以选择“ Windows Server 2003,...”。然后请再次尝试其他选项...
frupfrup 2014年

1

运行我们客户服务器的公司的负责人说,GUI程序无论如何都不会通过计划的任务运行。

他们使用还具有任务计划功能的监视系统。他们已经通过它进行了设置,并且看起来可行。

抱歉,我没有机会在这里评估更多建议,但无论如何还是感谢您的帮助。我希望它将来可以对其他人有所帮助,我认为肯定会有所帮助。


1

我试图在Windows 2008 R2服务器上使用任务计划程序启动和运行旧的VB6程序。该应用程序将通过批处理文件或单击快捷方式从exe运行,但不会从任务计划程序运行。我发现将存储在C:\ program files(x86)目录下的application文件夹中的应用程序配置文件复制到c:\ programdata上的application文件夹中。调度程序工作了。似乎cmd.exe从不同的位置将配置应用到任务计划程序使用的位置。如果您的应用程序具有配置文件,则可以尝试将其移动到c:\ programdata \ application文件夹。


0

您是否在脚本或程序中引用任何映射的网络驱动器?不久前,我遇到了一个类似的问题,我的计划任务无法运行,我也不知道为什么。将路径更改为UNC路径对我来说解决了它。

更改T:\Apps\MyProgram.exe\\MyServer\MyShare\Apps\MyProgram.exe


否,该程序在本地C:驱动器上。
MarioDS 2014年

0

当我配置任务说“无论用户是否登录都运行”,并且未选中“以最高特权运行”选项时,错误值为2147943859。

转换为十六进制的2147943859是800705b3,快速浏览Google会告诉我这表示“无法在计算机上启动安装程序。此操作需要交互式Window Station。”

现在,可能有某种方法可以使它以交互方式运行而不使用PSEXEC(来自Sysinternals),但是由于我已经知道如何使用PSEXEC来执行它。

PSExec:http ://technet.microsoft.com/zh-CN/sysinternals/bb897553.aspx

因此,将您的操作更改为在所有内容之前都添加psexec.exe -i(如果需要提升则添加-h),它应该可以工作。

我在Windows Server 2008 R2 SP1上的“操作”中尝试了以下操作:

c:\windows\system32\cmd.exe

然后是参数:

/c psexec.exe -h -i notepad.exe

当我手动运行任务时(由于没有时间表),我在当前会话中运行了一个提升的记事本。


0

也许这个问题的答案会帮助其他人阅读这个话题?

/programming/32589381/

摘要:的Windows 2012计划任务都没有看到正确的环境变量,包括PATH,为此任务设置为运行的帐户。

在完成上述工作之前,我花了很长时间阅读所有这些内容。(这是我自己的问题,导致与OP的问题相同。)

一旦您(最终!)知道了这一点,就很容易对其进行测试(按照stackoverflow的答案),看看它正在发生,然后解决它...。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.