Omn*_*nom 2 powershell scheduled-task
情况
在我们的组织中,我制作了一个 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"
Run Code Online (Sandbox Code Playgroud)
问题
问题是这很好用,大约 10 次中有 9 次。当它不起作用时,任务调度程序仍然报告退出代码 0,但似乎脚本甚至没有开始执行,因为没有任何反应并且没有创建日志文件。
一些额外的信息
我尝试过的一些事情
我想也许是任务调度程序触发脚本太快了,有些事情可能还没有初始化,所以我尝试设置 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
Run Code Online (Sandbox Code Playgroud)
$LastExitCode
有你的脚本的退出代码,你必须将它向上冒泡一级到任务调度程序。
向脚本添加一些错误处理并使用Exit
语句来设置实际退出代码也是一个好主意。