Pergunta

Eu estou usando o serviço UPS para monitorar o estado dos meus UPS de um aplicativo - a chave em HKLM \ SYSTEM \ CCS \ Services \ UPS \ Status tem todas as informações que você pode começar a partir do painel de controle do Poder. MAS - eu gostaria de ser capaz de dizer que a UPS desligar do meu aplicativo também. Eu sei que o serviço pode dizer que a UPS desligado - por exemplo, após a execução de um determinado número de minutos na bateria - e eu estou querendo saber se há algum tipo de comando que pode enviar para o serviço para iniciar um desligamento manualmente .

Estou tendo problemas para pesquisar esta informação - as pessoas tendem a cometer erros de ortografia "Uninterruptible" (GRH, Firefox vermelho-alinhado isso, mas não tem uma alternativa) e "UPS" só fica sucessos para o serviço de transporte. Talvez eu possa fazer algo por meio System.ServiceController, ou WMI?

ESCLARECIMENTO: Sim, eu estou falando sobre desligar o dispositivo UPS física. Eu sei como parar o serviço. Achei que seria um problema comum - Quero que meus UPS para desligar com o PC. Eu tive uma idéia que eu vou tentar, com base em esta página . Você vê, a APC (e todo mundo) tem de fornecer uma DLL para o serviço UPS a chamada, e uma vez que as chamadas de função estão bem documentados, não há nenhuma razão que eu não deveria ser capaz de P / Invoke-los. Vou reeditar desta vez eu sei se é ou não funcionou.

Update: Eu tentei invocando UPSInit, então UPSTurnOff, e nada acontece. Vou mexer com ela um pouco mais, mas a chamada direta para apcups.dll pode ser um beco sem saída.

Foi útil?

Solução 2

OK, eu tenho a resposta (testado!), Mas não é bonito. Meu APC UPS comunica usando o APC "inteligente" protocolo ( mais aqui ). O que você precisa no meu caso é um "desligamento suave", comando "S". Mas primeiro você precisa ter certeza de que é no modo "Smart" ( "Y"). Agora, se você quiser deixar o estado do monitor serviço Windows UPS, o serviço terá um punho de ferro na porta COM. Então você pode a) deixar o serviço Windows Desligue a UPS, ou b) matar o serviço e virar as UPS fora de si mesmo.

A UPS em si tem um "período de graça" depois que ele recebe o comando "S", dando-lhe tempo para desligar o sistema operacional. Isto significa que para fazer (a) acima, você tem que:

  • utilidade da matança (rede) de potência
  • Aguarde até que o tempo limite do Windows UPS Serviço (padrão e mínimo de 2 minutos)
  • Wait for Windows para desligar - bem perto do final, ele irá enviar o comando "S"
  • Aguarde até que o período de carência UPS, após o qual ele vai realmente se desligar

Eu acho que vamos optar por (a), só porque (b) envolve trabalho extra matando o serviço e implementação das comms serial.

Outras dicas

Verifique meus comentários a Herman, que pretende fechar as UPS para baixo, não o serviço UPS, correto? Quero dizer, você quer essa coisa para desligar, matar o poder, etc, certo?

Se assim for, você está olhando-o sobre uma UPS por modelo de UPS. Duvido dois deles iria funcionar da mesma.

Em suas pesquisas, em vez de UPS, tente "APC", ou "bateria". Eu acho que uma grande parte do código é o que é executado em laptops para lidar com estar na bateria, etc ...

Alguns lugar escondido em alguns arquivos antigos empoeirados Tenho informações de protocolo para APC UPS de, e os comandos que eles respondem a, e que eles enviar para o PC, etc. Mas este era caminho de volta no dia em que utilizado para ligar de nossos UPS aos nossos computadores com cabos seriais ... Você pode realmente falar com um no-break com Qmodem ou Hyperterm ...

aprendeu de falar com os caras da APC. Eles são muito agradável e útil. Agora-a-dia, eu acho que você acabou de postar uma URL que vem de seu software Powerchute, e ele vai falar diretamente com a UPS, e realizar seus comandos.

Por favor, diga em que língua você está tentando fazer isso ... se você estiver usando .NET você pode fazer isso com classe ServiceController (ler os docs).

Para controlar serviços em Win32 API usando C / C ++, Funções de serviço (Windows) .

Por exemplo, para interromper um serviço que você pode usar a função ControlService da seguinte maneira (este é um rápido e exemplo sujo):

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

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

Note que você precisa fornecer uma alça Service Manager em hServMgr eo nome \\ UPS_SERVICE_0 é o nome que deve coincidir com o seu serviço UPS desejado (ou o Windows built-in ou outro).

Lembre-se que para parar um serviço que você precisa os direitos de segurança apropriados. Este não é um problema com uma conta Adminstration, mas tenha em mente o que acontece quando o log com uma conta de não-administrador.

Espero que ajude.

Sobre desligar o dispositivo UPS física, lembro-me de volta em dias Win98 eu era capaz de desligamento do dispositivo de falar com as UPS através da porta COM, apesar I não se lembra da marca ou como a interface de programação foi.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top