Служба ИБП Windows (источник бесперебойного питания) — отключить ИБП?

Я использую службу ИБП для мониторинга состояния моего ИБП из приложения — ключ в HKLM\SYSTEM\CCS\Services\UPS\Status содержит всю информацию, которую вы можете получить из панели управления питанием. НО - я хотел бы также указать ИБП, чтобы он отключился из моего приложения. Я знаю, что служба может приказать ИБП отключиться, например, после работы в течение заданного количества минут от батареи, и мне интересно, есть ли какая-то команда, которую я могу отправить службе, чтобы инициировать отключение вручную. .

У меня возникли проблемы с поиском этой информации — люди склонны неправильно писать «непрерывный» (хм, Firefox выделил это красным, но не имеет альтернативы), а «UPS» просто попадает в службу доставки. Может быть, я могу что-то сделать через System.ServiceController или WMI?

ПОЯСНЕНИЕ: Да, я говорю об отключении физического устройства ИБП. Я знаю, как остановить службу. Я полагал, что это будет распространенная проблема — я хочу, чтобы мой ИБП выключался вместе с ПК. У меня возникла идея, которую я собираюсь попробовать, на основе этой страницы. Видите ли, APC (и все остальные) должны предоставить DLL для вызова службы UPS, и, поскольку вызовы функций хорошо документированы, нет никаких причин, по которым я не мог бы P/Invoke их. Я отредактирую это, как только узнаю, сработало это или нет.

Обновление: я попытался вызвать UPSInit, затем UPSTurnOff, но ничего не происходит. Я поработаю с этим еще немного, но прямой вызов apcups.dll может оказаться тупиком.


person Coderer    schedule 23.12.2008    source источник


Ответы (3)


Проверьте мои комментарии Герману, вы хотите выключить ИБП, а не СЛУЖБУ ИБП, верно? Я имею в виду, вы хотите, чтобы эта штука отключилась, отключила питание и т. д., верно?

Если это так, вы ищете ИБП по модели ИБП. Сомневаюсь, что два из них будут работать одинаково.

В поиске вместо ИБП попробуйте "APC" или "аккумулятор". Я думаю, что большая часть кода - это то, что работает на ноутбуках, чтобы справиться с работой от батареи и т. Д.

Какое-то место, спрятанное в каких-то пыльных старых файлах. У меня есть информация о протоколе для ИБП APC, и команды, на которые они реагируют, и то, что они посылают на ПК и т. д. Но это было УДАЛЕНО в те дни, когда мы подключали наши ИБП к нашим компьютерам. с ПОСЛЕДОВАТЕЛЬНЫМИ кабелями... На самом деле вы могли бы поговорить с ИБП с помощью Qmodem или Hyperterm...

Узнал об этом, поговорив с ребятами из APC. Они очень милые и полезные. В наши дни, я думаю, вы просто публикуете URL-адрес, исходящий от вашего программного обеспечения Powerchute, и он будет напрямую общаться с ИБП и выполнять ваши команды.

person LarryF    schedule 23.12.2008

Хорошо, у меня есть ответ (проверено!), но он некрасивый. Мой ИБП APC взаимодействует с использованием протокола APC "Smart" (подробнее здесь). Что вам нужно в моем случае, так это «мягкое отключение», команда «S». Но сначала вам нужно убедиться, что он находится в «Умном» режиме («Y»). Теперь, если вы хотите разрешить мониторингу состояния службы ИБП Windows, служба будет иметь железную хватку на COM-порте. Таким образом, вы можете либо а) позволить службе Windows отключить ИБП, либо б) убить службу и отключить ИБП самостоятельно.

У самого ИБП есть «льготный период» после получения команды «S», что дает вам время выключить вашу ОС. Это означает, что для выполнения пункта (а) выше вам необходимо:

  • Убить коммунальное (сетевое) питание
  • Подождите, пока истечет время ожидания службы Windows UPS (по умолчанию и минимум 2 минуты).
  • Подождите, пока Windows выключится — ближе к концу она отправит команду «S».
  • Дождитесь льготного периода ИБП, после которого он фактически выключится

Я думаю, что мы собираемся выбрать (а) только потому, что (б) требует дополнительной работы, убивая службу и внедряя последовательные коммуникации.

person Coderer    schedule 22.01.2009

Пожалуйста, скажите, на каком языке вы пытаетесь это сделать... если вы используете .NET, вы можете сделать это с помощью класса ServiceController (прочитайте документы).

Для управления службами в Win32 API с помощью C/C++ функции службы (Windows).

Например, чтобы остановить службу, вы можете использовать функцию ControlService следующим образом (это быстрый и грязный пример):

OpenService (hServMgr, TEXT("\\UPS_SERVICE_0"), SC_MANAGER_ALL_ACCESS);

SERVICE_STATUS stat;
ControlService (hUpsService, SERVICE_CONTROL_STOP, &stat)

Обратите внимание, что вам необходимо указать дескриптор Service Manager в hServMgr, а имя \\UPS_SERVICE_0 — это имя, которое должно совпадать с желаемой службой UPS (либо встроенной в Windows, либо другой).

Помните, что для остановки службы вам нужны соответствующие права безопасности. Это не проблема с учетной записью администратора, но имейте в виду, что происходит при входе в систему с учетной записью без прав администратора.

Надеюсь, это поможет.

Что касается выключения физического устройства ИБП, я помню, что еще во времена WIn98 я мог отключить устройство, разговаривающее с ИБП через COM-порт, хотя я не помню марку или интерфейс программирования.

person Hernán    schedule 23.12.2008
comment
Я думаю, он имеет в виду, что хочет выключить ИБП.. Не службу ИБП. Кодерер, поправьте меня, если я ошибаюсь. Вы хотите остановить службу ИБП или фактически отключить ИБП (таким образом, потеряв питание) из-за кода? - person LarryF; 23.12.2008
comment
Извините, да он хочет отключить физический ИБП! Я не нашел ответа на эту проблему. Однако многими системами ИБП можно управлять через порты COM1 или USB. - person Hernán; 23.12.2008