情况
在我们的组织中,我做了一个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。
一些额外的信息
有些事我已经尝试过了
我想也许任务调度程序触发脚本太快,有些事情可能还没有初始化,所以我试着设置一个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命令时使用,但是你有一个脚本文件。
详情在这里