6月末、とあるPCメーカーが自社製PCの一部のモデルで「Windows Update」をユーザーに無断で無効化していたという問題が発覚しました。メーカーが「ユーザーに無断で無効化する」のはダメですが、企業のIT管理者の管理下にあるPCのWindows Updateを一時的に無効化するのは“アリ”ですよね。
毎月恒例の「Windows Update」は、“Windowsにまつわる都市伝説”が生まれる宝庫です。その真偽のほどは別にして、例えば次のようなウワサ話が毎月第二火曜日(日本はその翌日の水曜日)前後にネット上を飛び交います。
などなど……
とあるPCメーカーが自社製PCの一部のモデルでWindows Updateをユーザーに無断で無効化していたという話は都市伝説ではなく、本当の話だったようです。問題のPCメーカーは、自社製PCのソフトウエア更新ツールを通じて、Windows Updateを無効化する隠しプログラムを配布し、PCのWindows Updateの設定を勝手に無効化していたということです。
Windowsユーザーなら、多くの方が一度はWindows Updateを原因とするトラブルに遭遇したことがあるのではないでしょうか。無用なトラブルを避けるため、Windows Updateを「手動」で実行している、あるいは毎月第二火曜日(日本はその翌日)だけ一時的に「無効」にして、ネット上のやりとりで問題がないかどうか様子を見るという人もいるでしょう。
ユーザーに無断でWindows Updateを「無効」にするのは言語道断ですが、無効化する気持ちが分からなくもないとうIT管理者の方も少なからずいると思います。普段はWindows Updateを自動更新で運用し、多くの新しい更新プログラムが一度に配布される毎月第二火曜日(日本はその翌日)から数日間は一時的に無効化して、様子を見るという運用方法は極力トラブルを回避するための良いアイデアかもしれません。
なお、Windows Updateの設定は「コントロールパネル」の「システムとセキュリティ」→「Windows Update」→「設定の変更」にある「重要な更新プログラム」のリストボックスで、以下の四つから選択して構成します。
(1)更新プログラムを自動的にインストールする(推奨)
(2)更新プログラムをダウンロードするが、インストールを行うかどうかは選択する
(3)更新プログラムを確認するが、ダウンロードとインストールを行うかどうかは選択する
(4)更新プログラムを確認しない(推奨されません)
Windows Updateの設定は、レジストリの以下のキーにある「AUOptions」値に格納されます。上記の四つの選択肢は、上から値のデータ「4」「3」「2」「1」に対応します。
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
このコマンドラインを記述したバッチファイル(拡張子.batまたは.cmd)を「タスクスケジューラー」(タスクの管理)に登録して、コンピューターの起動時などに最上位の権限で自動実行させるようにすれば、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)を実行すると、毎月第二火曜日から7日間の期間中、Windows Updateの設定が「無効」(更新プログラムを確認しない)になっていない場合は、ユーザーに問い合わせた上で「無効」に切り替えます(画面2)。
期間外で自動更新が「有効」(更新プログラムを自動的にインストールする)になっていない場合は、同様にユーザーに問い合わせた上で「有効」に切り替えます。すでに期間中、期間外に想定している設定になっている場合は何もしません。
このスクリプトをユーザーのログオン時に最上位の権限で自動実行するようにタスクスケジューラーでスケジューリングしておけば、第二火曜日の翌日に自動更新でWindows Updateが動作することを回避できます。
7日間が経過すれば再び自動更新に戻そうとするため、永久に「無効」のままということにはなりません(画面3)。なお、日本では第二火曜日の翌日に新しい更新プログラムの配布が開始されますが、前日から無効化しておくのが確実なので、第二火曜日を期間の始まりとしています。また、期間は「delayDays=<日数>」で調整することが可能です。
今回筆者が作成したスクリプトは、Windows Updateは自動更新にしたいけど、Windows Updateのトラブルに遭遇するのは避けたいという個人のWindowsユーザーや企業のIT管理者の役に立つと思います。このまま使わなくても、日付の判断するコードやWindows Updateの設定切り替えコードはいろいろと応用できるでしょう。
企業の場合、本来なら「Windows Server Update Services(WSUS)」や「System Center Configuration Manager」、またはその他のパッチ管理ツールを使用して、配布対象の更新プログラムやスケジュールを完全にコントロールするべきです。今回のスクリプトは、それができない環境に対する一つの提案です。ぜひ、活用してください。
岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。
Copyright © ITmedia, Inc. All Rights Reserved.