前回はこちら。
今回は次の機能について実現性を調べてみる。
3.再起動後、シャットダウンする機能
今回は「PCが再起動した後に自動ですぐにシャットダウンする機能」がつくれるのか、つくれるならどうすればつくれるのかを調べていく。
まず、プログラムの動きの全体像を整理しよう。ここで、これまでの2つの機能「Windowsの更新・再起動が必要かどうか判別する」「Windowsを強制的に再起動する」を実現するプログラムを「プログラムA」とでも呼ぼう。
- ユーザーはPCをシャットダウンするために、プログラムAを実行する。
- プログラムAは、Windowsの更新が必要かどうかを、「WUApiLib」ライブラリで判別する。
- Windowsの更新が必要な場合、プログラムAはPCを強制的に再起動する。
- PCが再起動した直後、ログオンすることなくPCをシャットダウンする。
今回実現できるか確かめたいのは最後(4番目)の処理だ。実現するためには次の条件をクリアしておく必要がある。
- ユーザーが何か操作しなくても再起動後に自動的にシャットダウンできる。
- 強制的にシャットダウンできる。
どんな手段で実現できるかちょっと調べてみると、大きく2つの方法が見つかった。
1つ目は、PowerShellとレジストリを使う方法。レジストリに、ユーザー名とパスワード、ログオン時に実行するスクリプトを登録すれば、次回起動時に自動ログオンとスクリプトの自動実行が行われる。この方法を使えば、スクリプトに「強制シャットダウン」の処理を仕込んでおけば、再起動後の自動シャットダウンが実現できる。
ただ、これではログオンした後にレジストリの変更内容を確実に元の状態に戻しておかないとレジストリが汚染されてしまい、以後のPCの動作がカオスになる可能性がちょっとだけある。
レジストリだから、このちょっとの可能性を考えただけでも、なんか嫌だ。
2つ目は、「サービス」と呼ばれるWindowsプログラムをつくる方法だ。
サービスについて、詳しくはMSDNの解説ページを参照するとよい。
プログラムをサービスとしてつくれば、Windowsにログオンしなくても自動的に強制シャットダウンの処理が実行できそうだ。レジストリもいじらなくてよい。
つくりたい仕組みの主な仕様
以上の実現性の確認結果をまとめると、つくろうとする仕組みの主な仕様はこんな感じになりそう。
- 次の2つのプログラムで構成される。
- Windowsアプリケーション
- ユーザーはPCをシャットダウンするときはこのアプリでシャットダウンすることを習慣にしておく。
- 実行されたら、まずWindowsの更新・再起動が必要かどうかを「
WUApiLib」ライブラリで確認する。 - 更新・再起動が必要な場合
- 何らかのファイル(ファイルA)を用意して「Windows更新・再起動を行ったよ」という目印のデータを残しておく。
- PCを強制的に再起動する。実行中のプロセスはすべて終了する。
- 更新・再起動が不要な場合
- PCを強制的にシャットダウンする。実行中のプロセスはすべて終了する。
- Windowsサービス
- Windowsが起動する度に実行されるようにWindowsに登録しておく。
- 実行されたら、ファイルAを読みに行く。
- ファイルAに「Windows更新・再起動を行ったよ」という旨の目印のデータがある場合
- ファイルAを削除してWindowsを強制的にシャットダウンする。
- ファイルAがない場合
- 何もせずこのサービスを終了する。
次からはそれぞれの設計に入っていこう。
次回はこちら。