none
UPSサービスの情報を取得したい。 RRS feed

  • 質問

  • VisualStudio 2005 C#を使用していますが、

    Windows XPのUPSサービスから情報を取得する方法はありますか?

    やりたいことは、

    UPSの通電状態を監視して、

    UPSがバッテリー駆動になった時に特定の処理(データの保存など)を

    行った後にパソコンのシャットダウンをするというものです。

     

    2006年3月1日 1:53

回答

  • いろいろ調べた結果、

    APCのUPSにはAPC Smart Protocolというプロトコルで

    通信が出来るということが判明しました。

    そこで、今回はSerialPortで通信することで対応することにいたしました。

    お騒がせしました。m(__)m

    2006年3月8日 1:45

すべての返信

  • WMI の Win32_UninterruptiblePowerSupply クラスを使うのはどうでしょうか。

    マネージドから WMI の監視ってのはいまいちサンプルがありませんが、取りあえず MSDN の記事

    // でもそれって普通 UPS 付属のユーティリティでやることのような……(^^;

    2006年3月1日 9:35
  •  Hongliang は書きました:

    WMI の Win32_UninterruptiblePowerSupply クラスを使うのはどうでしょうか。

    マネージドから WMI の監視ってのはいまいちサンプルがありませんが、取りあえず MSDN の記事

    // でもそれって普通 UPS 付属のユーティリティでやることのような……(^^;

    Hongliangさま

    回答ありがとうございます。

    早速、調べてみます。

    // でもそれって普通 UPS 付属のユーティリティでやることのような……(^^;

    とても長い期間実行するので、

    実行中に停電があった場合のデータ保存が目的なんです。

    ですからOSから強制終了通知をもらう前にいくつかやることがあるので知りたかったわけです。

     

    2006年3月1日 11:22
  • >実行中に停電があった場合のデータ保存が目的なんです。
    >ですからOSから強制終了通知をもらう前にいくつかやることがあるので知りたかったわけです。
    サービスアプリケーションを使えば、電源の変更通知が受け取れます。

        partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
                this.CanHandlePowerEvent = true; // 電源の変更イベント通知を取得する。
            }
            protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
            {
                // ここでイベントの種類判別&必要な処理を記述する。
                return base.OnPowerEvent(powerStatus);
            }
        }
    PowerBroadcastStatusの値は
    http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemserviceprocesspowerbroadcaststatusclasstopic.asp
    を参考にすればいいと思います。

    2006年3月2日 3:51
  •  k_kazu は書きました:

    サービスアプリケーションを使えば、電源の変更通知が受け取れます。

        partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
                this.CanHandlePowerEvent = true; // 電源の変更イベント通知を取得する。
            }
            protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
            {
                // ここでイベントの種類判別&必要な処理を記述する。
                return base.OnPowerEvent(powerStatus);
            }
        }
    PowerBroadcastStatusの値は
    http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemserviceprocesspowerbroadcaststatusclasstopic.asp
    を参考にすればいいと思います。

    k_kazuさま

    回答ありがとうございます。

    調べてみたのですが、こちらはラップトップ用の電源の変更イベントで、

    つまりノートパソコンの電源(ACから内蔵バッテリに切り替わった)用のようです。

    最初PowerStateusクラスで行おうとしたのですが、

    やはりこちらもノートパソコン用みたいで...

    それから、Hongliangさま

    Win32_UninterruptiblePowerSupply クラスを試みました。

    ↓こんな感じ...

    ManagementClass managementClass = new ManagementClass("Win32_UninterruptiblePowerSupply");
    ManagementObjectCollection managementObj = managementClass.GetInstances();
    foreach (ManagementObject mo in managementObj)
    {
        if (mo["ActiveInputVoltage"] != null)
        {
            ushort activeI = (ushort)mo["ActiveInputVoltage"];

            string[] activeInputVoltage ={ "-",
                                      "1 Other ",
                                      "2 Unknown ",
                                      "3 Range 1 ",
                                      "4 Range 2 ",
                                      "5 Both ",
                                      "6 Neither " };

            if (activeI <= 6)
            {
                stateListBox.Items.Add("ActiveInputVoltage :\t" + activeInputVoltage[activeI]);
            }
            else
            {
                stateListBox.Items.Add("ActiveInputVoltage :\tUnknown");
            }
        }

    ↑ここまで...

    全てのプロパティについて表示させようとしたのですが、

    プロパティの内容がnullだったりして全てのプロパティを取得することが出来ません。

     

    UPSサービスと同じ内容(電源オプションのUPSタブで表示される内容)を期待したのですが、UPSとパソコン間はRS-232Cで接続されているのですがケーブルの挿抜に応じてUPSタブの内容はそれなりに変化するのですが、自作プログラムでは内容が保持されたままとなってしまい、コントロール不能の状態が判別できませんでした。

    後は、UPSサービスを停止させてポートを直接見るかUPSサービスから別プログラムを起動するかぐらいしかなさそうです。(-_-;)

     

    2006年3月2日 5:10
  •  番頭 は書きました:

    つまりノートパソコンの電源(ACから内蔵バッテリに切り替わった)用のようです。



    ノートパソコンで ACから内臓バッテリーに切り替わる = デスクトップパソコンでUPSに切り替わる
    だと思います。
    .NET Framework 2.0 だと UPSに切り替わった場合
    SystemInformation.PowerStatus.PowerLineStatus
    が Offline と なりませんか?

    UPSを持っていればご確認願います。

    2006年3月2日 7:43
  •  k_kazu は書きました:


    ノートパソコンで ACから内臓バッテリーに切り替わる = デスクトップパソコンでUPSに切り替わる
    だと思います。
    .NET Framework 2.0 だと UPSに切り替わった場合
    SystemInformation.PowerStatus.PowerLineStatus
    が Offline と なりませんか?

    UPSを持っていればご確認願います。

    k_kazuさま

    回答ありがとうございます。

    すみません。

    SystemInformation.PowerStatus.PowerLineStatus

    はUPSでは機能しないことは確認していました。

    ノートパソコンとデスクトップの電源の管理方法が異なっているようです。

     

    2006年3月2日 9:25
  • いろいろ調べた結果、

    APCのUPSにはAPC Smart Protocolというプロトコルで

    通信が出来るということが判明しました。

    そこで、今回はSerialPortで通信することで対応することにいたしました。

    お騒がせしました。m(__)m

    2006年3月8日 1:45