「更新してシャットダウン」の翌日の悲劇に遭わないために その2

前回の話で、Windows 10の更新後の起動で待たされる悲劇を回避するためには、Windowsの更新待ち状態でPCをシャットダウンするときに、自動で「更新して再起動してシャットダウン」ができればよさそうだということだった。

そのために何らかのソフトウェアが必要かも、となった訳だけど、そのソフトウェアが備えるべき機能はだいたいこういうイメージだった。

  1. Windowsの更新が待ち構えているかを判別する機能
  2. 現在実行中のアプリケーションの「待った!」を待たずに強制再起動する機能:これがないと「●●個のアプリを閉じて、シャットダウンします」なる画面に阻まれて再起動が始まらなくなってしまう。
  3. 再起動後、シャットダウンする機能

PCをシャットダウンするときには、このソフトウェアでシャットダウンするように習慣付けておけば、「翌日の恐怖」に晒されなくなる。

私が持ち合わせている技術でなんとなーくこれを実現できそうな方法は、

  • Windowsバッチファイル(*.bat)
  • Windowsアプリケーション(*.exe)

このどちらかだけど、まだよく分からない部分が多くてなんともいえない。

上で挙げたソフトウェア要件をどのようにしたら満たしていけそうか、1つずつ調べてみよう。今日はまず・・


1.Windowsの更新が待ち構えているかを判別する機能はどうやったら実現できるか

参考になりそうな質問掲示板(stackoverflow)のページを2つ見つけた。

Is it possible to detect the Windows Update status via registry, to see if the system is “fully updated”?

How to know if windows update is waitng for installation [duplicate]

これらのページのよると、COMライブラリの “WUApiLib” を使ってWindowsの更新に関する色々な情報が引き出せるらしい。そしてその情報の中には「更新のインストールの待機状態にあるかどうか」というものも含まれているとか。

と、いうことは、

このライブラリでWindowsが更新(再起動)待ちかどうかを判別して、もしも更新待ちだったら再起動→シャットダウンを行い、更新待ちでなかったら普通にシャットダウンするようにプログラムをつくって、あとはPCのシャットダウンをこのプログラムで行う習慣を身につければ・・

これは・・・使える!

COMというのは、Webサイトのドメインの .com ではなくて、こういうの↓

COM【Component Object Model】コンポーネントオブジェクトモデル

COMとは、マイクロソフト(Microsoft)社が提唱していた、ソフトウェアの機能を部品化して外部から呼び出して利用する仕組みを定めた技術仕様の一つ。主に同社のWindowsシリーズのOSやその上で動作するソフトウェアで利用された。

IT用語辞典 e-words

このCOMライブラリを使えば、C#でもC++でも、色々な形式のプログラムからWindowsの更新に関する情報が取得できるかも。

ただし、次のサイトにもあるように、C#でこのCOMライブラリを使う場合には「AnyCPU」をターゲットCPUとしてとしてプログラムをコンパイルする必要があるらしい。さもないと実行時エラーが起きて困っちゃうんだとか。

Windows 10 – WUApiLib exception

ちなみに、参考にしたサイトではWindows updateの情報を取得する方法として、Power Shellでコマンドを打ってWindows updateのログ情報をテキストファイルとして取得するものも紹介されていたけど、テキストファイルを解読する必要があったりしてなかなか面倒そう。

というわけで、いまのところ所望のソフトウェアを実現する一番よさそうな方法は

Windowsアプリケーション(*.exe)からWUApiLibライブラリ をたたく

といえそうだ。

Windowsアプリケーションは、C#でつくるのが一番簡単かな。

次回は、「2.現在実行中のアプリケーションの「待った!」を待たずに強制再起動する機能」の実現方法について調べてみよう。

「更新してシャットダウン」の翌日の悲劇に遭わないために その2」への1件のフィードバック

  1. ピンバック: 「更新してシャットダウン」の翌日の悲劇に遭わないために その3 – // もちぶろ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です