任务计划程序只杀死 cmd.exe 而不是它的子进程

ice*_*ava 7 windows windows-server-2003 task-scheduler

我们的客户有一些运行由任务计划程序激活的批处理作业的 Windows 2003 服务器。执行工作的实际程序是自定义的 .exe 进程,它们被聚合到 .cmd 脚本中,以便在计划的时间间隔到来时由 Task Scheduler 一起启动。cmd 脚本中的行可能会也可能不会使用 Call 命令来启动单独的 .exe 程序。

在此设置中,任务计划程序有效地监视 cmd.exe,并且在使用进程资源管理器时,可以观察到子 .exe 进程停放在 cmd.exe 进程树下。但是,当任务计划程序由于超出允许的时间限制而终止 cmd.exe 时,子 .exe 进程可能不会与其父进程一起被终止并成为孤立的。这些进程无限期地停滞不前。由于进程资源管理器中显示的进程线程状态,我怀疑这些进程最终出错并弹出了一个 .NET 调试器对话框(这些是 .NET 应用程序),由于批处理作业用户是一个单独的用户,因此无法看到该对话框帐户。

最初,当我在我的 Windows XP 工作站上调查此行为时,我观察到从我的测试 .cmd 脚本启动的子 .exe 进程确实在任务计划程序决定时间到时与 cmd.exe 一起被杀死。我无法孤立子进程。

基于一种预感,我最终转移到一台 Windows 2003 机器上进行测试。同样,子进程会像我工作站中的进程一样被终止。我的第二步是使用另一个用户帐户来运行计划任务。这一次,cmd.exe 在超过时间限制后被杀死,但子进程仍然存在,就像我的客户在他们的生产服务器中观察到的一样。

如果我抢先登录该批处理用户帐户(恰好是另一个管理员帐户)以声明桌面会话,则来自我的测试 .exe 程序的任何错误或信息弹出窗口都将路由并呈现在该桌面上,允许我查看实际的用户输出。如果我只在调用计划任务后登录,桌面会话将不会“回收”现有进程的窗口;他们永远隐藏。

我的问题是,我在这里缺少什么条件会导致任务计划程序不清除 cmd.exe 下的子进程?使用另一个会引起这种行为的帐户有什么特别之处,但在使用我当前的管理员帐户运行计划任务时却没有?

Ada*_*and 0

如果您认为这是由于弹出调试器消息所致,您是否尝试过将代码包装在try{}catch{}块中并记录错误?

否则,也许你可以做的是让进程写入输出WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent())

我怀疑孩子们正在以某种方式将他们的权限级别升级为管理员,然后就不能与父母一起被杀死。

要在不修改代码的情况下对此进行测试,您可以编写另一个计划任务,尝试使用taskkill终止其他进程。此计划任务应以管理员身份运行。如果有效,那么看起来这是一个安全问题。