- ベストアンサー
PCの起動・終了時の処理に関して
教えて下さい。 プログラムにてPCの起動時、終了時にデータベースにアクセスし、PCの電源が 入っているか?切れているか?の情報を更新し、その書き込まれたデータベースで PCの状態を掴むような事をしたいと考えています。 PCのシャットダウン等のコマンドは単純に記述できますが、状態を確認するような事は 可能なのでしょうか? また、電源起動時はスタートアップか何かに設定すれば良いかと思われますが、終了時 というトリガーは何かきっかけはありますでしょうか? 漠然とした質問で申し訳ありませんが、教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>もう少しだけタイミングの事を詳細に教えて頂ければと思います。 申し訳ありませんが、随分前に調べた時と状況は変わっていないと思いますので、スタートアップ及びシャットダウンスクリプトの実行タイミングについては詳細な資料が無いようです。 一応参考のURLを記載します。 http://itpro.nikkeibp.co.jp/free/NT/WinReadersOnly/20041129/3/ http://www.monyo.com/technical/windows/33.html 経験則ですが、スタートアップ及びシャットダウンスクリプトの実行タイミングではネットワークは生きていましたのでDB接続のようなネットワーク接続が必要なスクリプトも動作するのではと思っています。 ちょっと確認ですが、状態を見たいのはPCの起動と終了でいいんですよね。 つまりPCを起動して、ログオンせずにシャットダウンした場合にもスタートアップ及びシャットダウンスクリプトの実行されるのですが、これでいいのですよね。 ログオン及びログオフのタイミングならば話がすこし変わってきますので。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>全てのPCでというのが、どうしても台数が多い為、難しいです、、、、 少し冷静になりなさい。 最初の質問の内容通りの「起動時と終了時に動作するプログラムを仕込む」のも「全てのPCで行う必要がある」のですよ。 なので「全てのPCで何らかの作業を行う」のは「絶対に避けて通れない」です。 で、何も作らなくて済むのが「Windowsの標準の機能である、ファイル共有の機能を利用する」と言う、当方の手法。 この手法の利点は「どこかのPCが立ち上がっているかダウンしているかを調べるだけなら、Windows標準のコマンドだけで出来る」と言う点。 全てのPCでの作業が嫌なのであれば(「どうしても必要な事なのに「台数が多い」と逃げるのは、単なる「逃避」であり「面倒だから嫌だ」と言っているのと同等)、定期的に「ネットワークコンピューターに接続を試みるAPIを呼び出すプログラム」を作って常駐させる必要がある。 これならファイル共有の設定がされていないPCであっても、コンピュータ名(または直IPアドレス)でアタッチする事は可能なので、監視プログラムで「アタッチに成功したら起動中、アタッチに失敗したらダウン中」と判断が出来る。 あと、IPアドレスが固定であれば「IPアドレスにPINGを飛ばして、反応があれば起動中、タイムアウトすればダウン中」と言う、超簡単な調べ方もある(が、PCによっては「PINGされても反応を返さない」と言う設定になってる場合や、電源が入っているがWindowsが起動されてない場合もPINGに応答してしまうので、PINGでは正確な判断は出来ない。 それと、起動されているPCの一覧が欲しいだけなら、コマンドプロンプトで NET VIEW と打ち込むだけで可能。これを NET VIEW > ACTIVE_LIST.TXT とかリダイレクトすれば、結果をテキストファイルに残せる。 あとは、そのテキストファイルを読み込んで「リストにあれば起動中、リストに無ければダウン中」と表示するだけの初心者でも作れるプログラムを作れば、目的は達成できる。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>プログラムにてPCの起動時、終了時にデータベースにアクセスし、PCの電源が >入っているか?切れているか?の情報を更新し、その書き込まれたデータベースで >PCの状態を掴むような事をしたいと考えています。 そんな複雑怪奇なプログラムは不要です。 すべてのPCで「ファイル共有」を有効にして、どこか適当なフォルダを、何か適当な共有名で、他PCに共有開放します。 そして、共有開放したフォルダに、適当な「固有のファイル名」のファイルを作成しておきます。 他PCでは、コマンドプロンプトの「NET」コマンドを使って、接続を確立できるかどうかを調べます。 例えば、Zドライブが未使用のドライブレターとして空いていて、固有のファイル名が「MARKFILE.TXT」なら、バッチファイルで NET USE Z: /DELETE NET USE Z: \\調べたいPCのコンピュータ名\共有名 IF EXIST Z:\MARKFILE.TXT GOTO OK 電源が入っていない場合にやりたいコマンド(データベースに書き込むなど) GOTO END :OK 電源が入っている場合にやりたいコマンド(データベースに書き込むなど) :END と言うのを作って動かせば良いです。 ファイル共有は「起動すれば勝手にオンになる」し「終了時は何もしなくて良い」ので、起動時や終了時に、複雑な仕掛けを施す必要はありません。 バッチファイルを、以下の内容にすれば、調べたいコンピュータ名を引数で与えて可変に出来ます。 NET USE Z: /DELETE NET USE Z: \\%1\共有名 これで呼び出したあと、呼び出し元のプログラムで「Z:\MARKFILE.TXTが存在するかチェック」すれば、そのコンピューターがダウンしているかどうか判ります。 データベースなんか要りません。起動時と終了時の小細工も要りません。質問者さんは「考えすぎ」です。
- maesen
- ベストアンサー率81% (646/790)
OSはWindowsということでいいですよね。 やりたいことは、スタートアップスクリプトとシャトダウンスクリプトで出来るのではないかと思います。 スタートアップスクリプト及びシャトダウンスクリプトにデータベースにアクセスするスクリプト等を実行するように設定します。 スクリプトはバッチでもVBSでWindowsで実行出来るものは起動出来ると思います。 設定は、Active Directoryのメンバでない場合には「ローカルコンピュータポリシー」で設定します。 コンピュータの構成\Windowsの設定\スクリプト Active Directoryのメンバならばグループポリシーでも設定出来ますのでこちらはADの管理者に確認して下さい。 注意点としては、このスクリプトはローカルシステム権限で動作します。 データベースアクセスなどではスクリプト内でログインなどを適切に設定する必要があります。 だいたいの起動のタイミングは、こんな感じだと思います。 スタートアップスクリプト:サービス群が起動した後 シャットダウンスクリプト:ログオフの後、サービス群停止の前
補足
maesen様、ご回答ありがとうございます。 環境はWindowsでした。 説明不足で申し訳ありません。 もう少しだけタイミングの事を詳細に教えて頂ければと思います。 何から何まで申し訳ありませんが、教えて下さい。
補足
chie65535様、ご回答ありがとうございます。 全てのPCでというのが、どうしても台数が多い為、難しいです、、、、 少なくとも何かのプログラムを常駐させなければならないかとは思われますが、そのプログラム等で、 何分間隔かで起動を確認し、自分のPCが起動していたらDBに更新というような事ができないかと考えています。 結果として、DBに書き込まれなかった時間がある程度経過したら、DB側の方でシャットダウン されたんだなと認識する。 そんな事は難しいでしょうか、、、 教えて下さい。