Задача: завершить работу компьютера под управлением ОС MS Windows Server 2003, используя сигнал ACPI, генерируемый при кратковременном нажатии на кнопку питания.
Казалось-бы, что за задача такая, смешная? Привычное дело - нажал кнопку и верная MS Windows XP/Vista/Seven приступила к завершению работы. Так оно так, да только не в "серверных" версиях. В MS Windows Server 2000/2003/2008 для защиты от случайного (или намеренного несанкционированного) нажатия на кнопку "питания" этот функционал по умолчанию отключен. Попросту говоря, система не обслуживает поступающие сигналы ACPI.
Предположим, мы готовы идти на риски случайного (или неслучайного) останова сервиса. Как вариант, предположим, что наш сервис находится на виртуальной машине, завершить работу которой проще всего с помощью эмуляции сигнала ACPI. Сделаем три шага навстречу счастью взаимопонимания.
Первым делом явно укажем операционной системе, что делать при нажатии кнопки выключения компьютера:
"Пуск" => "Панель управления" => "Электропитание" => "Дополнительно" => "При нажатии кнопки выключения компьютера" => "Завершение работы"
Далее разрешим операционной системе принимать указание завершить работу от "кого угодно", хоть бы даже и от совершенно постороннего, получившего доступ к физической консоли или кнопке выключения:
Запускаем "оснастку" gpedit.msc => "Конфигурация компьютера" => "Конфигурация Windows" => "Параметры безопасности" => "Локальные политики" => "Параметры безопасности" => "Завершение работы: разрешить завершение работы системы без выполнения входа в систему" => "Включен"
То-же самое, на любителя, можно сделать прямо в реестре:
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ System \ ShutdownWithoutLogon => "dword:00000001"
Забавно, да, но указать системе принимать сигнал ACPI можно только вот таким извращённым способом - разрешив действие, имеющее отношение к консоли, но никак не к кнопке "питания".
Если ресурсы целевого сервера используются через "Terminal Services", то предыдущих двух шагов недостаточно - при нажатии на кнопку выключения на "нулевую" консоль будет выводится модальное диалоговое окно с "shutdown warning message" о том, что компьютер используется другими пользователями и просьбой подтвердить твёрдость наших намерений в выключении компьютера. Естественно, что интерактивно взаимодействовать в этом случае попросту некому - следует подавить запрос.
Для отключения "shutdown warning message" необходимо добавить в реестре новую запись (надо полагать, выставляющую минимальное время ожидания ответа на запрос до начала завершения работы):
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ ShutdownWarningDialogTimeout => "dword:00000001"
Кроме разрешения завершать работу любому желающему, получившему доступ к физической консоли, нужно ещё отключить запрос на ввод комбинации "Ctrl+Alt+Del" для ввода логина и пароля при входе в систему.
Я заметил, что сигнал ACPI система принимает, но почему-то не отрабатывает в том случае, если в системе не "залогинено" ни одного пользователя. Но, достаточно после посылки сигнала ACPI подключится к физической консоли (монитор и клавиатура или VNC) и послать "трёхбуквенное" сочетание - как система радостно приступает к завершению работы.
Запускаем "оснастку" gpedit.msc => "Конфигурация компьютера" => "Конфигурация Windows" => "Параметры безопасности" => "Локальные политики" => "Параметры безопасности" => "Интерактивный вход в систему: не требовать нажатия CTRL+ALT+DEL" => "Включен"
Аналогичного поведения от системы можно добиться правкой реестра:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System \ DisableCAD => "dword:00000001"
На этом всё - на моей практике серверы MS Windows 2003 (виртуальные, конечно - для физических такое надругательство над основами информационной целостности и безопасности неприемлемо) отличненько уходят в завершение работы при поступлении соответствующего сигнала ACPI.
В процессе перепахивания форумов и блогов, я натыкался на другое решение последней препоны, феерически тупое - включение автоматического ответа на все модальные диалоговые окна (http://msdn.microsoft.com/en-us/library/ms940850) с помощью ключа "EnableDefaultReply" реестра. Думаю, что не нужно здесь объяснять - почему это плохо?
19 сентября 2012 в 01:43
19 сентября 2012 в 08:18