我在 Windows Server 2016 下的任务计划程序中遇到了一个奇怪的问题。
我创建了一个每天凌晨 3 点触发的任务。此任务仅启动一个简单的批处理文件,该文件会删除本地驱动器上的某些文件。所以没什么特别的。
运行此任务的结果是 0xC0000142。无论我手动启动此任务还是它在凌晨 3 点由 Windows 启动。
但如果我重新启动整个服务器并手动启动任务,它就会正常工作。结果是 0x0。我尝试通过注册表增加“Windows SharedSection”并重新启动,但什么也没发生。第二天早上我得到了 0xC0000142 的结果。
我在 XML 中的任务:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2018-11-29T11:46:43.174076</Date>
<Author>ECB189B\Administrator</Author>
<URI>\Delete temp</URI>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2018-11-29T03:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-21-3460449123-1791338768-3707012617-500</UserId>
<LogonType>S4U</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\mybatch.bat</Command>
</Exec>
</Actions>
</Task>
我的批次:
@ECHO OFF
del /Q /S C:\temp\*.*
该问题仅影响一台服务器。所有其他执行相同任务的服务器均不存在此问题。
/EDIT
好的,我尝试了一下。我将“无论用户是否登录都运行”更改为“仅当用户登录时运行”。这有效。我在凌晨 3 点运行此任务时没有收到更多错误消息,但这不是解决方案。为什么“无论用户是否登录都运行”模式不起作用?我尝试了管理员和系统用户。
答案1
根据http://blog.ylnotes.com/winfix-error-0xc0000142-windows-task-scheduler-fails-to-run-in-batch-mode/
当计算机的非交互式桌面堆空间用尽时,Windows 任务计划程序无法以批处理模式运行。重新启动服务器可能会纠正这个暂时的问题,直到桌面堆再次耗尽。调整非交互式桌面堆的大小已知可以永久解决此错误。
桌面堆信息默认桌面堆设置:Windows 32 位服务器:SharedSection=1024,3072,512 Windows 64 位服务器:SharedSection=1024,20480,768
对于 Windows NT:
SharedSection 使用以下格式指定系统和桌面堆:
SharedSection=xxxx,yyyy 对于 Windows 2000 及更高版本:
SharedSection 使用以下格式来指定系统和桌面堆:
共享部分=xxxx,yyyy,zzzz
修理:
运行注册表编辑器 regedit.exe
在注册表编辑器中浏览到以下项:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems
单击修改 SubSystems\Windows 值。%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16
在此值的数据中找到 SharedSection 参数。此参数将有 3 或 4 个值。
将第三个 SharedSection 值逐步增加 256 或 512,直到问题解决
可能需要重新启动才能生效。