Ситуация
В нашей организации я создал объект групповой политики, который создает запланированную задачу. Эта задача запускается при входе в систему двух учетных записей пользователей.
Он выполняет сценарий 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, но кажется, что сценарий даже не начинает выполняться, потому что ничего не происходит и файл журнала не создается.
Некоторая дополнительная информация
Некоторые вещи, которые я пробовал
Я подумал, что, возможно, планировщик задач запускал скрипт слишком быстро, а некоторые вещи, возможно, еще не инициализированы, поэтому я попытался установить задержку в 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
имеет код выхода вашего скрипта, вы должны переместить его на один уровень вверх в планировщик задач.
Также было бы неплохо добавить в сценарий некоторую обработку ошибок и использовать Exit
операторы для установки фактических кодов выхода.
Удалить -Command
из параметров вашего скрипта и вместо этого используйте -File
. Команда предназначена для использования, когда вы вводите команды PowerShell, но вместо этого у вас есть файл сценария.
подробности Вот