Назад | Перейти на главную страницу

Запланированная задача выполняется с кодом выхода 0, но сценарий PowerShell не всегда выполняется

Ситуация

В нашей организации я создал объект групповой политики, который создает запланированную задачу. Эта задача запускается при входе в систему двух учетных записей пользователей.

Он выполняет сценарий 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"

Эта проблема

Проблема в том, что это работает нормально, примерно в 9 случаях из 10. Когда это не работает, планировщик задач по-прежнему сообщает код выхода 0, но кажется, что сценарий даже не начинает выполняться, потому что ничего не происходит и файл журнала не создается.

Некоторая дополнительная информация

Некоторые вещи, которые я пробовал

Я думаю, что планировщик задач кода выхода сообщает, что запускает powershell.exe, а не ваш скрипт.

Попробуйте изменить его на это:

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

$LastExitCode имеет код выхода вашего скрипта, вы должны переместить его на один уровень вверх в планировщик задач.

Также было бы неплохо добавить в сценарий некоторую обработку ошибок и использовать Exit операторы для установки фактических кодов выхода.

Удалить -Command из параметров вашего скрипта и вместо этого используйте -File . Команда предназначена для использования, когда вы вводите команды PowerShell, но вместо этого у вас есть файл сценария.

подробности Вот