计划任务运行退出代码0,但PowerShell脚本并不总是执行

情况

在我们的组织中,我做了一个GPO来创build一个计划任务。 此任务在login两个用户帐户时触发。

它执行一个powershell脚本来更改networking连接的DNS服务器。 (要阻止这些用户的一些网站,使用dnsmasq。我知道这不是一个防弹解决scheme,但它是足够好的。)

计划任务的操作是这个命令:

C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe

这些是参数:

-ExecutionPolicy Bypass –NoProfile –Command "& {C:\ProgramData\ORGNAME\scripts\SetDNS.ps1}" > C:\ProgramData\ORGNAME\scripts\SetDNS.log

正如你所看到的,输出被发送到一个日志文件。

这是脚本的内容:

 $wmi = get-wmiobject Win32_NetworkAdapterConfiguration -filter "ipenabled = 'true'" foreach($adapter in $wmi) { if($adapter.description -NotLike "*VMware*") { $adapter.SetDNSServerSearchOrder("XXX.XXX.XXX.XXX") } } invoke-expression -command "c:\windows\system32\ipconfig /flushdns" 

问题

问题是,这个工作正常,约10次9。 当它不工作,任务调度程序仍然报告退出码0,但似乎脚本甚至不开始执行,因为什么也没有发生,日志文件没有创build。

一些额外的信息

  • 该任务在SYSTEM帐户下运行
  • 它运行的最高privilleges
  • 当任务按需运行时,它工作正常
  • 所有电脑都运行Windows 7企业版(x64)

有些事我已经尝试过了

  • 我想也许任务调度程序触发脚本太快,有些事情可能还没有初始化,所以我试着设置一个30秒的延迟。

  • 每5分钟重新运行15分钟。

  • 当它失败时重新启动任务,这显然不工作,因为powershell.exe似乎返回错误代码0。

我认为退出代码任务调度器报告是运行powershell.exe不是你的脚本。

尝试将其更改为:

 -ExecutionPolicy Bypass –NoProfile –Command "& {C:\ProgramData\ORGNAME\scripts\SetDNS.ps1; exit $LastExitCode}" > C:\ProgramData\ORGNAME\scripts\SetDNS.log 

$LastExitCode具有脚本的退出代码,您必须将其升级到任务调度程序的一个级别。

在脚本中添加一些error handling并使用Exit语句来设置实际的退出代码也是一个好主意。

从脚本参数中删除-Command ,而使用-File 。 命令是为了在你inputpowershell命令时使用,但是你有一个脚本文件。

详情在这里