Windows Updateの有効/無効の自動切り替えで、トラブルを未然に防ぐその知識、ホントに正しい? Windowsにまつわる都市伝説(35)

6月末、とあるPCメーカーが自社製PCの一部のモデルで「Windows Update」をユーザーに無断で無効化していたという問題が発覚しました。メーカーが「ユーザーに無断で無効化する」のはダメですが、企業のIT管理者の管理下にあるPCのWindows Updateを一時的に無効化するのは“アリ”ですよね。

» 2015年07月06日 05時00分 公開
[山市良テクニカルライター]
「Windowsにまつわる都市伝説」のインデックス

連載目次

ユーザーに無断で無効化するのはNGだけれど……

 毎月恒例の「Windows Update」は、“Windowsにまつわる都市伝説”が生まれる宝庫です。その真偽のほどは別にして、例えば次のようなウワサ話が毎月第二火曜日(日本はその翌日の水曜日)前後にネット上を飛び交います。

Windowsにまつわる都市伝説の数々

  • Windows Updateがある毎月第二火曜日(日本はその翌日)はインターネットが遅くなる
  • 深夜3時になると電源をオフにしたはずのPCが勝手に起動する
  • XX月のWindows UpdateでPCが起動不能になるらしい
  • 何度インストールしても毎回出てくる更新プログラムがある
  • XX月のWindows Updateはいつまでたっても終わらない
  • 古いOSからのアップグレードを促進するために、Windows Updateの動作は重くなっている
  • PCのトラブルの大部分はWindows Updateが原因
  • 「手動更新」にしていたはずが、勝手に「自動更新」に戻っていた
  • Windows Updateを「無効」にすると、マイクロソフト製のマルウエア対策ソフトウエアの定義ファイルが自動更新されないらしい

  などなど……


 とあるPCメーカーが自社製PCの一部のモデルでWindows Updateをユーザーに無断で無効化していたという話は都市伝説ではなく、本当の話だったようです。問題のPCメーカーは、自社製PCのソフトウエア更新ツールを通じて、Windows Updateを無効化する隠しプログラムを配布し、PCのWindows Updateの設定を勝手に無効化していたということです。

 Windowsユーザーなら、多くの方が一度はWindows Updateを原因とするトラブルに遭遇したことがあるのではないでしょうか。無用なトラブルを避けるため、Windows Updateを「手動」で実行している、あるいは毎月第二火曜日(日本はその翌日)だけ一時的に「無効」にして、ネット上のやりとりで問題がないかどうか様子を見るという人もいるでしょう。

Windows Updateの設定変更を自動化するのは意外と簡単

 ユーザーに無断でWindows Updateを「無効」にするのは言語道断ですが、無効化する気持ちが分からなくもないとうIT管理者の方も少なからずいると思います。普段はWindows Updateを自動更新で運用し、多くの新しい更新プログラムが一度に配布される毎月第二火曜日(日本はその翌日)から数日間は一時的に無効化して、様子を見るという運用方法は極力トラブルを回避するための良いアイデアかもしれません。

 なお、Windows Updateの設定は「コントロールパネル」の「システムとセキュリティ」→「Windows Update」→「設定の変更」にある「重要な更新プログラム」のリストボックスで、以下の四つから選択して構成します。

「重要な更新プログラム」のインストール構成

(1)更新プログラムを自動的にインストールする(推奨)

(2)更新プログラムをダウンロードするが、インストールを行うかどうかは選択する

(3)更新プログラムを確認するが、ダウンロードとインストールを行うかどうかは選択する

(4)更新プログラムを確認しない(推奨されません)


 Windows Updateの設定は、レジストリの以下のキーにある「AUOptions」値に格納されます。上記の四つの選択肢は、上から値のデータ「4」「3」「2」「1」に対応します。

Windows Updateの設定を格納するレジストリキー

HKEY_LOCAL_MACHINE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update


 コマンドプロンプトを管理者として実行し、以下の3行のコマンドを実行すると、Windows Updateを無効(更新プログラムを確認しない)にすることができます(画面1)。自動更新を有効(更新プログラムを自動的にインストールする)にするには、「1」の部分を「4」にするだけです。

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v "AUOptions" /t REG_DWORD /d 1 /f
NET STOP WUAUSERV
NET START WUAUSERV
画面1 画面1 Windows Updateをコマンドプロンプトから無効化している様子

 このコマンドラインを記述したバッチファイル(拡張子.batまたは.cmd)を「タスクスケジューラー」(タスクの管理)に登録して、コンピューターの起動時などに最上位の権限で自動実行させるようにすれば、Windows Updateの一時的な無効化や再有効化を自動化することができます。

“無断”ではないWindows Updateの無効化/有効化スクリプト

 たとえIT管理者の管理下にあるPCといえども、無断で構成を変更するのはよろしくないと思われる場合には、次のようなWindows Script Host(WSH)のスクリプトを利用するのはいかがでしょうか。

'Windows Update を第二火曜日から無効化する期間
delayDays = 7
'今日の日付
dateToday = DateValue(Now())
'今月の1日
date1st = DateValue(Year(dateToday) & "/" & Month(dateToday) & "/1")
'今月の第二火曜日
If Weekday(date1st) < 4 Then
  date2ndTue = DateAdd("d",10-Weekday(date1st),date1st)
Else
  date2ndTue = DateAdd("d",17-Weekday(date1st),date1st)
End If
If (dateToday >= date2ndTue) and (dateToday < DateAdd("d",delayDays,date2ndTue)) Then
  '第二火曜日から1週間は自動更新を無効(AUOptions: 1)にする
  ChangeAUSetting(1)
Else
  '第三火曜日以降から第二火曜日前日までは自動更新を有効(AUOptions: 4)にする
  ChangeAUSetting(4)
End If
Sub ChangeAUSetting(AUNewSetting)
  Dim AUSetting(5)
  AUSetting(1) = "更新プログラムを確認しない"
  AUSetting(2) = "更新プログラムを確認するが、ダウンロードとインストールを行うかどうかは選択する"
  AUSetting(3) = "更新プログラムをダウンロードするが、インストールを行うかどうかは選択する"
  AUSetting(4) = "更新プログラムを自動的にインストールする"
  Set oShell = WScript.CreateObject ("WScript.shell")
  AUCurrentSetting = oShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\AUOptions")
  If AUCurrentSetting <> AUNewSetting then
    Msg = "Windows Update の現在の設定[" & AUSetting(AUCurrentSetting) & "]を[" & AUSetting(AUNewSetting) & "]に変更します。よろしいですか?" & vbCrLf & vbCrLf & "お知らせ:" &vbCrLf & "このプログラムは毎月第二火曜日から " & delayDays & " 日間の期間中、Windows Updateを無効化しようとします。期間終了後、自動更新に戻します。" 
    ret = MsgBox(Msg,vbExclamation + vbYesNo,"自動更新の設定の変更")
    If ret = vbYes then
      oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\AUOptions",AUNewSetting,"REG_DWORD"
      oShell.Run "net stop wuauserv", vbHide, True
      oShell.Run "net start wuauserv", vbHide, True
      Msg = "Windows Update の設定を変更しました。新しい設定は[" & AUSetting(AUNewSetting) & "]です。" 
      MsgBox Msg, vbInformation + vbOKOnly, "自動更新の設定の変更"
    End If
  End If
End Sub
サンプルスクリプト:EscapePatchTue.vbs

 このスクリプト(EscapePatchTue.vbs)を実行すると、毎月第二火曜日から7日間の期間中、Windows Updateの設定が「無効」(更新プログラムを確認しない)になっていない場合は、ユーザーに問い合わせた上で「無効」に切り替えます(画面2)。

画面2 画面2 2015年7月の第二火曜日である14日またはそれ以降にログオンすると、スクリプトによりメッセージを表示してWindows Updateの設定を無効化する

 期間外で自動更新が「有効」(更新プログラムを自動的にインストールする)になっていない場合は、同様にユーザーに問い合わせた上で「有効」に切り替えます。すでに期間中、期間外に想定している設定になっている場合は何もしません。

 このスクリプトをユーザーのログオン時に最上位の権限で自動実行するようにタスクスケジューラーでスケジューリングしておけば、第二火曜日の翌日に自動更新でWindows Updateが動作することを回避できます。

 7日間が経過すれば再び自動更新に戻そうとするため、永久に「無効」のままということにはなりません(画面3)。なお、日本では第二火曜日の翌日に新しい更新プログラムの配布が開始されますが、前日から無効化しておくのが確実なので、第二火曜日を期間の始まりとしています。また、期間は「delayDays=<日数>」で調整することが可能です。

画面3 画面3 2015年7月の第二火曜日から7日経過したら、スクリプトによってWindows Updateの設定が「自動」に戻される

本来なら、パッチ管理はきちんとコントロールすべきです

 今回筆者が作成したスクリプトは、Windows Updateは自動更新にしたいけど、Windows Updateのトラブルに遭遇するのは避けたいという個人のWindowsユーザーや企業のIT管理者の役に立つと思います。このまま使わなくても、日付の判断するコードやWindows Updateの設定切り替えコードはいろいろと応用できるでしょう。

 企業の場合、本来なら「Windows Server Update Services(WSUS)」や「System Center Configuration Manager」、またはその他のパッチ管理ツールを使用して、配布対象の更新プログラムやスケジュールを完全にコントロールするべきです。今回のスクリプトは、それができない環境に対する一つの提案です。ぜひ、活用してください。

「その知識、ホントに正しい? Windowsにまつわる都市伝説」バックナンバー

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。