Обнаружение запланированного выключения - PullRequest
8 голосов
/ 27 мая 2011

У меня есть сценарий cmd, который будет выполнять набор исправлений, и он предназначен для прерывания, если требуется перезагрузка, чтобы избежать проблем с исправлениями.Я также хотел бы расширить сценарий для прерывания, если запланирована перезагрузка (например, с помощью команды «shutdown»), чтобы избежать перезагрузки промежуточного патча, если это возможно.К сожалению, мне не удалось найти способ обнаружить это, кроме попыток запланировать другое отключение, что приводит к:

Выключение системы уже запланировано. (1190)

Хотя теоретически я мог бы использовать это, я не думаю, что было бы хорошей практикой пугать зарегистрированных пользователей каждый раз, когда мне нужно было проверить запланированную перезагрузку.Что мне действительно нужно, так это способ ЗАПРОСИТЬ состояние, измененное командой «shutdown».

Возможно ли это?Я буду доволен действительно любым решением, которое не подразумевает, что я постоянно запускаю приложение в системе, чтобы перехватывать события выключения (которые, я думаю, даже не отправляются до тех пор, пока отключение не будет фактически запущено)

Ответы [ 4 ]

1 голос
/ 23 января 2013

У меня та же проблема, я искал все, но не нашел ничего полезного.

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

Средство просмотра событий может сказать вам, что завершение было запланировано, но не КОГДА оно было запланировано.

Одна идея состоит в том, чтобы запросить средство просмотра событийдля самого последнего выключения системы, самого последнего запланированного выключения и самой последней отмены запланированного выключения.Если запланированное отключение является более поздним, чем самое последнее отменение или завершение работы, то оно выполняется.Идентификаторы событий: 1074 для запуска по расписанию, 1075 для отмены по расписанию, в Windows Logs / System 12 для запуска системы 13 для закрытия системы (все в Windows Logs / System)

Я был слишкомМне лень делать это в пакетном файле, я знаю, что это возможно.

Так вот, что я в итоге сделал: вместо того, чтобы запланировать завершение работы, просто попытайтесь прервать его.Если выключение не выполняется, выдается сообщение об ошибке (Невозможно прервать выключение системы, поскольку выключение не выполнялось. (1116)).Гораздо лучше, я думаю, чем пугать пользователя, планируя завершение работы.

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

@echo off
shutdown /a
if errorlevel 1 call:shutdown
goto end

:shutdown
    set /p choice=Shutdown in how many minutes? 
    set /a mod=60
    set /a mod*=%choice%
    shutdown /s /t %mod%

:end

РЕДАКТИРОВАТЬ - я вернусь к этому ответу, поскольку у меня есть дополнительная информация для добавления.

Вышеупомянутое решение обнаружит, было ли запланировано выключение через выключение.Команда exe с использованием аргумента / t.

Если вам необходимо определить, запланировано ли в Windows завершение работы (как это происходит автоматически после некоторых обновлений Windows), то существует заданная запись реестра, которую вы можете запросить.Ниже приведен PowerShell, но вы можете написать командный файл, чтобы сделать то же самое.

Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'

Примечание: это не вернет true, если перезагрузка запланирована с помощью shutdown.exe, оно вернет true, только если Windows сообщит, что ваш компьютер необходимо перезагрузить.

0 голосов
/ 23 февраля 2015

Еще один способ сделать это, если ваш сценарий устанавливает выключение, - сохранить переменные% date% и% time% в глобальных средах с помощью команды setx. Затем вы можете проверить эти переменные при следующем вызове скрипта.

0 голосов
/ 28 мая 2011

Возможно, вы можете попытаться инициировать отключение, вызвав ExitWindowsEx с большим льготным периодом и проверив код возврата ERROR_SHUTDOWN_IS_SCHEDULED и немедленно вызвав AbortSystemShutdown если ExitWindosExвозвращение успешно (указывает на то, что вы успешно запланировали завершение работы)

0 голосов
/ 28 мая 2011

Полагаю, вы могли бы использовать API планировщика задач , чтобы перечислить запланированные задачи и посмотреть, вызывает ли какая-либо из них shutdown.exe.Но я не уверен, что это надежно. Вероятно, есть несколько способов запланировать выключение.

...