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

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,但似乎脚本甚至没有开始执行,因为没有任何反应并且没有创建日志文件。

一些额外的信息

  • 该任务在 SYSTEM 帐户下运行
  • 它以最高的特权运行
  • 当任务按需运行时,它工作正常
  • 所有计算机都运行 Windows 7 Enterprise (x64)

我尝试过的一些事情

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

  • 每 5 分钟重新运行一次任务,持续 15 分钟。

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

Pet*_*orf 8

我认为退出代码任务调度程序报告的是用于运行 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语句来设置实际退出代码也是一个好主意。