情况
在我们的组织中,我创建了一个创建计划任务的 GPO。此任务在两个用户帐户登录时触发。
它执行一个 powershell 脚本来更改网络连接的 DNS 服务器。(使用 dnsmasq 为这些用户屏蔽一些网站。我知道这不是一个防弹的解决方案,但它已经足够好了。)
计划任务的操作是以下命令:
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,但似乎脚本甚至没有开始执行,因为没有任何反应并且没有创建日志文件。
一些额外的信息
- 任务在SYSTEM账户下运行
- 它以最高权限运行
- 当任务按需运行时,它工作正常
- 所有计算机都运行 Windows 7 企业版 (x64)
我尝试过的一些事情
我想也许任务调度程序触发脚本的速度太快了,有些事情可能还没有初始化,所以我尝试设置一个 30 秒的延迟。
每 5 分钟重新运行一次任务,持续 15 分钟。
失败时重新启动任务,这显然不起作用,因为powershell.exe似乎返回错误代码0。
我认为退出代码任务计划程序报告的是用于运行 powershell.exe 而不是您的脚本。
尝试将其更改为:
$LastExitCode
具有脚本的退出代码,您必须将其提升到任务调度程序的一级。Exit
在脚本中添加一些错误处理并使用语句来设置实际的退出代码也是一个好主意。-Command
从您的脚本参数中删除 并改为使用-File
. 命令是在您输入 powershell 命令时使用的,但您有一个脚本文件。详情在这里