2008-12-23 51 views
1

我正在使用UPS服務從應用程序監控UPS的狀態 - HKLM \ SYSTEM \ CCS \ Services \ UPS \ Status中的密鑰包含您可以從電源控制面板獲得的所有信息。但是 - 我希望能夠告訴UPS關閉我的應用程序。我知道該服務可以告訴UPS關閉 - 例如,在電池上運行一段時間後 - 我想知道是否有某種命令可以發送給服務以手動啓動關機。Windows UPS(不間斷電源)服務 - 關閉UPS?

我在搜索這些信息時遇到了麻煩 - 人們往往會拼錯「不間斷」(hrm,Firefox紅線,但沒有其他選擇),而「UPS」只是獲得了運輸服務的點擊率。也許我可以通過System.ServiceController或WMI來做些什麼?

澄清:是的,我正在談論關閉UPS物理設備的電源。我知道如何停止服務。我想這將是一個常見問題 - 我想讓我的UPS關閉電腦。我有一個想法,我會嘗試,基於this page。你看,APC(和其他人)必須爲UPS服務提供一個DLL來調用,並且由於函數調用有充分的文檔記錄,所以沒有理由不能P /調用它們。一旦我知道它是否有效,我將重新編輯它。

更新:我試着調用UPSInit,然後UPSTurnOff,沒有任何反應。我會補充一點,但直接調用apcups.dll可能是一個死衚衕。

回答

1

好的,我有答案(測試!),但它不漂亮。我的APC UPS使用APC "Smart" protocolmore here)進行通信。你需要的是我的情況是「軟關機」,「S」命令。但首先你需要確保它處於「智能」模式(「Y」)。現在,如果您想讓Windows UPS服務監視器狀態,服務將在COM端口上留下一絲烙印。因此,您可以a)讓Windows服務關閉UPS,或者b)停止服務並自行關閉UPS。

UPS本身在獲得「S」命令後會有一個「寬限期」,讓您有時間關閉操作系統。這意味着,要做到上述(a),你必須:

  • 殺工具(市電)電源
  • 等待Windows的UPS服務超時(默認值和最小2分鐘)
  • 等待Windows關閉 - 右接近尾聲,它將把「S」命令
  • 等待UPS寬限期後,它實際上將自行關閉

我覺得我們要選擇(一),只是因爲(二)涉及額外的工作殺死th e服務和實現串行通信。

-1

請告訴你想用什麼語言來做......如果你使用.NET,你可以使用ServiceController類來完成(閱讀文檔)。

用於控制使用C/C++的Win32 API中的服務,Service Functions (Windows)

例如停止服務,您可以使用ControlService函數如下(這是一個快速和骯髒的例子):

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

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

請注意,您需要在hServMgr和提供服務管理器手柄\\ UPS_SERVICE_0名稱是必須與所需的UPS服務(Windows內置或其他)匹配的名稱。

請記住,要停止服務,您需要適當的安全權限。這對Adminstration帳戶不是問題,但請記住使用非管理員帳戶進行日誌記錄時會發生的情況。

希望有所幫助。

關於關閉物理UPS設備,我記得在98年前,我可以通過COM端口將設備斷電與UPS通話,儘管我不記得品牌或編程界面是如何。

+0

我認爲他意味着他想關閉UPS ..不是UPS服務。 Coderer,糾正我,如果我錯了..你是否要停止UPS服務,或實際上關閉UPS(從而失去電源)的代碼? – LarryF 2008-12-23 00:42:01

2

查看我對Herman的評論,你想關閉UPS,而不是UPS服務,對不對?我的意思是,你想要關閉這個東西,殺掉這個電源等等,對吧?

如果是這樣,你正在通過UPS模型在UPS上查看它。我懷疑他們中的兩個人的工作原理是一樣的。

在您的搜索中,而不是UPS,請嘗試「APC」或「電池」。我認爲很多代碼是在筆記本電腦上運行以處理電池等問題。

某些地方隱藏在一些塵土飛揚的舊文件中我有APC UPS的協議信息以及它們響應的命令,以及他們發送給PC等的內容但是當我們用串行電纜將我們的UPS連接到我們的計算機時,這就是WAY的背景......您實際上可以用Qmodem或Hyperterm與UPS聯繫...

從與人交談中學習APC。他們非常好,樂於助人。現在,我認爲您只需發佈Powerchute軟件的網址,並直接與UPS通話,並執行您的命令。