我目前正在尝试在 Zabbix 中设置对 Windows 计划任务的监控。只需监视通过 201 事件过滤的 Microsoft-Windows-TaskScheduler/Operational 事件日志并在返回代码上进行正则化似乎很容易,但是当我开始模拟错误来测试监视时,什么也没有发生。
事实证明,我们所有的 Windows 2012 服务器总是在事件日志中记录“返回代码 0”,即使它实际上在任务计划程序列表视图中正确显示它。当我说“有点”时,是因为如果计划任务运行的程序的退出代码为 1,则“上次运行结果”实际上显示 0x80070001。
我花了很多时间调整设置,例如用户帐户、仅在用户登录时运行、无论用户是否登录都运行、设置操作路径、以最高权限运行、为 Vista/7/2012 配置等等。没有任何帮助。
最后我在我的本地机器 Windows 7 和 2008R2 服务器上做了一些测试,两者都按预期工作。
我正在测试的特定任务运行了一个 PowerShell 脚本,使用 -Command 以便它正确传播退出,但为了排除任何 PS 问题,我还使用包含“exit 1”的批处理文件进行了测试,最后使用了一个小型 C# 控制台程序,它只返回您在命令行上提供的任何内容。
PS、批处理和控制台程序在 7 和 2008 上都工作正常,但在 2012 上都以同样的方式失败。
我已经用谷歌搜索了这个,但还是没找到。显然 0x80070005 和其他类似的错误代码有一定的含义,但这不是我的情况。就我而言,我的退出代码似乎与 0x80070000 进行了按位或运算。
我应该注意到,在所有情况下,即使是2012年,由任务启动的程序实际上执行并运行到最后,只是退出代码处理得很奇怪。
以下是测试运行的输出:
从 Powershell (我的 shell 写:( if $LASTEXITCODE > 0 ):
54 :( .\ExitCodeTest.exe 1
55 :( $LASTEXITCODE
1
56 :) .\ExitCodeTest.exe 10
57 :( $LASTEXITCODE
10
Windows Server 2008 R2 标准版:
Last Run Result (from list view): 0xA
Event 201 from event log Microsoft-Windows-TaskScheduler/Operational:
Task Scheduler successfully completed task "\ErrorTest" ,
instance "{b67a26cf-7fd8-461a-93d9-a5e48e72e558}" ,
action "D:\Tasks\ExitCodeTest.exe" with return code 10.
Windows Server 2012 Datacenter(请注意事件日志中的返回代码为 0):
Last Run Result (from list view): 0x8007000A
Event 201 from event log Microsoft-Windows-TaskScheduler/Operational:
Task Scheduler successfully completed task "\error test" ,
instance "{2bde46b8-2858-4772-a7ec-d66b29d893a6}" ,
action "D:\Tasks\ExitCodeTest.exe" with return code 0.
ExitCodeTest.exe 的来源:
static void Main( string[] args )
{
int exitCode = 0;
if ( args.Length > 0 )
{
exitCode = Convert.ToInt32( args[0] );
}
Environment.Exit( exitCode );
}
请帮忙,我已经无计可施了。
谢谢,
约翰