Узнать, когда выполняется shutdown -s

У меня есть главный компьютер, который знает, когда происходит отключение электроэнергии. Затем этот главный компьютер сообщит всем рабочим станциям о завершении работы по сети с помощью встроенной команды «shutdown / m \ computername / s». Этот главный компьютер также сообщит отдельным рабочим станциям о необходимости перезапуска с использованием того же механизма shutdown /m \\computername /r.

На каждой рабочей станции есть сценарий, который при запуске сохраняет все важные данные.

Каждая рабочая станция должна выполнить свой сценарий, когда ей сообщают о выключении или перезапуске по сети (shutdown /m \\computername /s или shutdown /m \\computername /r).

Идея1:

  • Используйте событие WM_QUERYENDSESSION, чтобы узнать, когда происходит выключение / перезапуск.
  • Отменить выключение / перезагрузку.
  • Запускаем скрипт.
  • Продолжить выключение / перезагрузку (Проблема: я не вижу разумного способа определить, было ли выполнено выключение или перезагрузка главным компьютером.)

Идея2:

  • Подождите, пока не появится процесс shutdown.exe.
  • Получить параметры командной строки этого процесса
  • Убейте этот процесс
  • Запускаем скрипт.
  • Запустите shutdown.exe с полученными параметрами.

Проблема: на самом деле shutdown.exe не запускается. Даже если вы запустите локально простой shutdown -s -t 30.

Идея3:

  • Отслеживайте входящий сетевой трафик.
  • Ищите пакеты shutdown -m
  • ...

Проблема: я понятия не имею, какой протокол используется и как форматируются пакеты.

Идея4:

  • Мониторинг журналов событий
  • Надеюсь, что он содержит информацию о том, какое отключение было выдано

Проблема: я не знаю, будет ли это регистрироваться и где.

PS:
Я не хочу использовать PsExec. Рабочие станции должны выполнять свои сценарии самостоятельно.


person Forivin    schedule 09.03.2017    source источник
comment
может быть лучше спросить в superuser и / или serverfault   -  person Jasen    schedule 10.03.2017
comment
Мой вопрос довольно специфичен для программирования.   -  person Forivin    schedule 10.03.2017
comment
Если речь идет о программировании, почему бы вам не запрограммировать собственный протокол выключения, реализованный с помощью определенного .exe, установленного на всех машинах, вместо использования shutdown.exe?   -  person Simon Mourier    schedule 15.03.2017
comment
Потому что он должен использовать официальный интерфейс shutdown / m.   -  person Forivin    schedule 15.03.2017
comment
Почему бы не объединить идею 1 и идею 2? Вы можете выяснить, было ли завершение работы отправлено основным компьютером или нет, потому что, если оно было отправлено основным компьютером, shutdown.exe не появится. Это несколько грубое решение, но оно может сработать. edit: это комментарий, потому что я недостаточно знаю, как все это работает, чтобы чувствовать себя уверенно, давая полный ответ.   -  person Unlocked    schedule 21.03.2017
comment
Почему в обработчике WM_QUERYENDSESSION невозможно сделать все необходимое? (Я знаю, почему это могло быть, но как насчет вашего случая?)   -  person KonstantinL    schedule 21.03.2017
comment
Потому что я не смог бы отличить выключение от перезапуска.   -  person Forivin    schedule 21.03.2017


Ответы (2)


Зачем делать это сложнее, если можно просто установить сценарии завершения работы Windows?

Это довольно просто:

Выполните gpedit.msc (локальные политики), а затем перейдите в: Настройки Windows -> Сценарии -> Завершение работы -> Свойства -> Добавить и добавьте сюда свой скрипт. Он всегда будет выключаться. Если вы хотите запускать его только в том случае, если вы вызываете завершение работы со стороны сервера, будет лучше создать очень простую программу на C # (или другую) для запуска вашего скрипта, а затем выключения компьютера. После этого вы можете вызвать его с сервера.

скриншот

ПРЕДУПРЕЖДЕНИЕ: сценарии запуска и завершения работы групповой политики не выполняются при использовании быстрой загрузки (по умолчанию включено в Windows 8 и более поздних версиях). В этом случае только перезагрузка или принудительное завершение работы (из командной строки) действительно завершает работу компьютера. Во всех остальных случаях (завершение работы меню «Пуск») ядро ​​компьютера переводится в спящий режим и обновляется при загрузке, а сценарии запуска и завершения GPO игнорируются.

Подробнее здесь.

Изменить:

Если у вас есть сценарий выключения, и вы не хотите создавать какую-либо программу, вы можете проверить в сценарии выключения, если это какой-то файл, то, что вы создали, существует, а если нет, то сделайте резервную копию и, если да, продолжите нормальное выключение и удалите этот файл. Когда у вас есть это, создайте другой скрипт и поместите его на рабочий стол или где-нибудь и запрограммируйте его на создание файла и запуск shutdown.exe, так что у вас будет нормальное завершение работы без резервного копирования, но если сервер вызовет завершение работы, он будет резервным.

person Samuel Tulach    schedule 15.03.2017
comment
Будет ли такой сценарий выключения также выполняться, когда система просто перезагружается? - person Forivin; 15.03.2017
comment
@Forivin Нет только в выключении. - person Samuel Tulach; 15.03.2017
comment
Что ж, мне нужно что-то, что работает как для выключения, так и для перезапуска. Можно ли также создать скрипт перезапуска? - person Forivin; 15.03.2017
comment
@Forivin Хм ... теперь я ищу некоторую документацию, и, возможно, она будет работать и при перезапуске, но если это не сработает, вы можете попробовать добавить сценарий выхода из системы, который будет выполняться при перезапуске, потому что Windows сначала выходит из профиля: Пользователь Конфигурация - ›Настройки Windows -› Сценарии - ›Вход или выход -› Свойства - ›Добавить - person Samuel Tulach; 15.03.2017

вы можете обнаружить завершение работы Windows в постоянно работающем приложении на каждой рабочей станции, например c # .net, и перед завершением работы запустите свой скрипт, а затем продолжите завершение работы. присоедините метод обработчика события к событию SystemEvents.SessionEnded. взгляните на здесь

person arman    schedule 21.03.2017