[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/09/04(Mon) 11:17
投稿者名:ダンボ
Eメール:
URL :
タイトル:
PC電源管理アプリを作る
グループ内でのPC電源消し忘れ防止のためのアプリを考えています。
前提/制約条件
・無停止ファイルサーバーに常駐する。
・同じWORKGROUP名で接続されたクライアントPCを管理する。
・クライアントPCには手を入れたくない。
・PCのOSはすべてWindowsXP(sp2)とするが、Windows95系/Linux系も将来検討する。
・サーバー負荷を増やしたくないのでCPU/メモリ消費量は極小にする。
基本設計
・クライアントPCの一覧表を作る。
・5分毎(設定で変更可)に各PCのCPU利用率を計る。
・連続して10回(設定で変更可)CPU利用率が10%(設定で変更可)以下なら消し忘れと判断する。
・消し忘れPCを強制シャットダウンする。
お聞きしたいこと
(1)このような無料ソフトはありませんか?
 「PC 電源 消し忘れ 防止」でググッたところ「パソコン管理人 今、何してる?」19800円
  http://www.de-net.com/pc3/seihin-annai/kanritool/index.htm
 は適しているようですが、有料andオーバスペックなので不可です。
(2)要素技術として、
・同じWORKGROUP名で接続されたPC一覧の取得方法
・他PCのCPU利用率の取得方法
・他PCの強制シャットダウン
がわかれば自作できそうですが、調べるべきAPIは何でしょうか?

投稿時間:2006/09/04(Mon) 18:49
投稿者名:いな
Eメール:
URL :
タイトル:
Re: PC電源管理アプリを作る
以前、このHPで紹介された
サイト(http://www.winapi-database.com/category.html)が残っていて、

> ・同じWORKGROUP名で接続されたPC一覧の取得方法
> ・他PCのCPU利用率の取得方法
> ・他PCの強制シャットダウン
    http://www.winapi-database.com/System/Powerdown/index.html
  が使えませんでしょうか?一部で申し訳ありません。

投稿時間:2006/09/04(Mon) 21:44
投稿者名:neptune
Eメール:
URL :
タイトル:
Re: PC電源管理アプリを作る
こんばんは
> ・他PCのCPU利用率の取得方法
面白そうなので調べたら、これはありました。ソースコードを公開されてます。
C++です。
GWaterさん
http://raijo.aa0.netvolante.jp/~gwater/
Win9x/NT においてCPUの利用率を取得するライブラリ[CpuUsage.h]
http://raijo.aa0.netvolante.jp/~gwater/freesoft/freesoft.html
XPもNT系なので調べると応用可能では?

改造してそのまま使わせてもらうのも手かと?

投稿時間:2006/09/05(Tue) 10:09
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^2: PC電源管理アプリを作る
いな さん、neptune さん、いつもお世話になっています。

ネットワーク関連のツールは作ったことが無いので取り合えずWinsockを下調べしています。

> ・他PCの強制シャットダウン
InitiateSystemShutdown、InitiateSystemShutdownExでOKですね。マシン名で指定するですか。

> ・他PCのCPU利用率の取得方法
After Idle、CpuUsageForNT.cppを見ています。自CPUはOKだが果たして他PCのCPUは見れるのか?

> ・同じWORKGROUP名で接続されたPC一覧の取得方法
見つかっていませんが、nbtstat -sの実行結果から切り出すか、すべてのマシン名を
設定ファイルに登録しておけば何とかなります。

どうも有り難うございました。

投稿時間:2006/09/06(Wed) 11:20
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^3: PC電源管理アプリを作る
 こんにちは。

> ネットワーク関連のツールは作ったことが無いので取り合えずWinsockを下調べしています。

 Winsockは、あんまり関係ないような...
 wmi とかの方が、使えそうなのがあると思います。
  http://wmifun.atinfinity.net/

> > ・他PCのCPU利用率の取得方法
> After Idle、CpuUsageForNT.cppを見ています。自CPUはOKだが果たして他PCのCPUは見れるのか?

 自PCなら以前タスクマネージャもどきのプログラムを作った
(アプリケーションタブの95%ぐらいできたところで断念)
のがあります。切り出すのは面倒なので、ソース全部を
Yahooのブリーフケースに入れてみました。

 http://briefcase.yahoo.co.jp/shimizu326

> > ・同じWORKGROUP名で接続されたPC一覧の取得方法
> 見つかっていませんが、nbtstat -sの実行結果から切り出すか、すべてのマシン名を
> 設定ファイルに登録しておけば何とかなります。

 以下のサンプルとかどうでしょう
 http://www.vbstation.net/
  特集
   Net関連(NT)
    NetServer
     サンプルダウンロード
 Unicodeの扱いがおかしいので、その当たりは見直したほうがいいですけど

 設定ファイルのほうが、確実ではないかとは思いますが。

投稿時間:2006/09/06(Wed) 13:39
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^4: PC電源管理アプリを作る
Starfish さん、どうも有り難うございます。

>  wmi とかの方が、使えそうなのがあると思います。
>   http://wmifun.atinfinity.net/
なるほど、よだれが垂れそうなトピックが多いですね。以前システム緒元を得るのに
ちょっとだけwmiを使ったような(記憶あやふや)


>  自PCなら以前タスクマネージャもどきのプログラムを作った
>  http://briefcase.yahoo.co.jp/shimizu326
貴重なサンプル有り難うございます。早速確保しました。
タスクマネージャって他のPCに接続してそちらのCPU利用率やイベントログが
見れますよね?ということはWindows(NT系)標準でそういうAPIなりプロトコル
がある筈なんですが。。。


> > > ・同じWORKGROUP名で接続されたPC一覧の取得方法
>  http://www.vbstation.net/
>     NetServer
いいですね。GUIも流用させていただこうか知らん。


>  設定ファイルのほうが、確実ではないかとは思いますが。
PCの拡張やPC名変更に対する柔軟性は低くなりますけど、10台前後なので
まずは、予想されるすべてのマシン名を設定ファイルに記載する方法で。


「み〜くんパパ」さんの所にも割と使えそうなサンプルがありました。
http://www.mitene.or.jp/~sugisita/vb6_net.html


管理対象PCの状態遷移定数など考えるのは楽しいですね。
-1:ポーリング応答なし(おまえは既に死んでいる)
0:CPU使用率10%以上
1:CPU使用率10%未満(連続1回目)
2:CPU使用率10%未満(連続2回目)
(以下同様)

投稿時間:2006/09/07(Thu) 01:13
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^5: PC電源管理アプリを作る

> 管理対象PCの状態遷移定数など考えるのは楽しいですね。
> -1:ポーリング応答なし(おまえは既に死んでいる)
> 0:CPU使用率10%以上
> 1:CPU使用率10%未満(連続1回目)
> 2:CPU使用率10%未満(連続2回目)
> (以下同様)

 CPUの使用率で10%未満だったら使っていないって、かなり微妙(^^;

 クライアントに仕込む必要がありますが、こんなのもあります。(W2K以降)

Public Declare Function GetTickCount Lib "kernel32" () As Long

Public Declare Function GetLastInputInfo Lib "user32" (pLastInputInfo As LASTINPUTINFO) As Long
Public Type LASTINPUTINFO
        cbSize  As Long
        dwTime  As Long
End Type


Private Sub Timer1_Timer()
Dim udtLastInputInfo As LASTINPUTINFO

    udtLastInputInfo.cbSize = Len(udtLastInputInfo)
    Call GetLastInputInfo(udtLastInputInfo)
    Label1.Caption = "アイドル時間" & CStr(CInt((GetTickCount - udtLastInputInfo.dwTime) \ 1000)) & "秒"

End Sub

 実際に使う場合は、負数や逆転する場合を考慮してください。