Служба бесперебойного питания Windows (UPS) - выключить ИБП? - PullRequest
1 голос
/ 23 декабря 2008

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 23 декабря 2008

Посмотрите мои комментарии к Герману, вы хотите выключить ИБП, а не СЕРВИС ИБП, верно? Я имею в виду, ты хочешь, чтобы эта штука отключилась, отключила электричество и т. Д., Верно?

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

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

Где-то спрятано в старых пыльных файлах. У меня есть информация о протоколе для ИБП APC, а также команды, на которые они отвечают, и то, что они отправляют на ПК и т. Д. к нашим компьютерам с кабелями SERIAL ... Вы могли бы фактически говорить с ИБП с Qmodem или Hyperterm ...

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

1 голос
/ 22 января 2009

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

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

  • Уничтожение коммунальной (сетевой) мощности
  • Ожидание времени ожидания службы ИБП Windows (по умолчанию и минимум 2 минуты)
  • Подождите, пока Windows закроется - прямо в конце, она отправит команду "S"
  • Дождитесь льготного периода ИБП, после чего он фактически отключится

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

0 голосов
/ 23 декабря 2008

Скажите, на каком языке вы пытаетесь это сделать ... если вы используете .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 (встроенной или другой).

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...