pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


1年くらい使用せず放置した開発機材のPCのWindows Updateが失敗する場合は、VisualStudio関連のアップデートの競合を疑ってみる。

ある案件の開発環境を入れていたPCを1年くらい放置していたのですが、久々に火を入れてみたらWindows Updateに時間がかかり、しかも失敗する事象が発生してしまいました。

なにしろ、Updateが全部終わるまでに3時間くらいかかり、そして再起動をかけると再起動後の処理が失敗するんです。そして全部がロールバックされてしまうという困った状況。

Windows Updateの一般的なトラブルシューティングは色々と情報がありますが、それを参考にしても失敗しまくる始末。なお、重要なアップデートだけでも50件を超えているので、いろいろと気分は下がり気味です。

まあしかし気を取り直して調べていくと、どうやら以下3点のアップデートのどれかが失敗していることが分かりました。

[Not Installed]: Microsoft Visual Studio 2010 Tools for Office Runtime 更新プログラム (KB2796590)
[Not Installed]: Microsoft Visual Studio 2010 Tools for Office Runtime 更新プログラム (KB2961149)
[Not Installed]: Microsoft Visual Studio 2010 Tools for Office Runtime の更新プログラム (KB3001652)

そこでこれをKB番号の小さい順(日付の古い順)に1つづつ試してみたらKB2796590, KB2961149はインストールできず、KB3001652をインストールしたら残りの2つは出てこなくなりました。

どうやら、Updateの競合が出ていたっぽいです。ひととおり終わったあとで上記のKBでググってみると、類似の話が色々みつかりました。しかしUpdateが多すぎる場合は試行錯誤でここまで絞り込むのは無理すぎ。


というわけで、今回の件のキモは下記3点にあります。

  • Update が失敗しているパッチの一覧をテキストデータで入手したい。
  • パッチを単体で入手して個別にインストールしたい。
  • 未適用のパッチ数が多いとOS起動時にWindows Updateが裏で動くのが重すぎるので一旦止めたい。

まずは「Update が失敗しているパッチの一覧をテキストデータで入手したい。」件ですが、これは VBScript で取得できます。私のところでは以下のスクリプトWindows Updateの成功失敗の一覧を取得しました。

Set objSession = CreateObject("Microsoft.Update.Session")
Set objSearcher = objSession.CreateUpdateSearcher
Set objResults = objSearcher.Search("Type='Software'")
Set colUpdates = objResults.Updates

For i = 0 to colUpdates.Count - 1
        If colUpdates.Item(i).IsInstalled <> 0 Then
            Wscript.Echo "[Installed]: " & colUpdates.Item(i).Title
        Else
            Wscript.Echo "[Not Installed]: " & colUpdates.Item(i).Title
        End If
Next

このスクリプトは以下の内容を参考にしながら改変して作りました。
Windows Updateの状況をテキストで出力させる - あたまのものおき


これを "CScript [スクリプト名]" と実行すれば以下のようなリストが出来ます。

[Installed]: Microsoft Office 2007 suites (KB3114742)   のセキュリティ更新プログラム
[Installed]: Microsoft Office Compatibility Pack Service Pack 3 (KB3114548)   のセキュリティ更新プログラム
[Installed]: Microsoft Office Word 2007 (KB3114748)   のセキュリティ更新プログラム
[Installed]: Microsoft Office Excel 2007 (KB3114741)   のセキュリティ更新プログラム
[Installed]: Microsoft Office Compatibility Pack Service Pack 3 (KB3114745)   のセキュリティ更新プログラム
[Installed]: Microsoft Office Outlook 2007 Junk Email Filter (KB3114743)  の更新プログラム
[Not Installed]: Windows 7 用更新プログラム (KB3118401)
[Not Installed]: Windows 7 用更新プログラム (KB3121255)
[Not Installed]: Windows 7 用更新プログラム (KB3035583)
[Installed]: Windows 7 用更新プログラム (KB3138612)
[Not Installed]: Windows 7 用更新プログラム (KB2952664)
[Not Installed]: Definition Update for Windows Defender - KB915597 (Definition 1.215.104.0)

つぎに「 パッチを単体で入手して個別にインストールしたい」件ですが、"Windows7 32bit -64bit KB番号" のように検索すればダウンロードページが見つかります。これをダウンロードして個別インストールすればよいわけです。インストールに失敗した項目は例えば以下のように抽出できます。ここでは Visual Studio、Sliverlight、Windows 10、Skype のアップデートを除外しておるわけですが、これらは他のアップデートに比べると後回しでよいだろうと考えたからです。(cat や grep を使っているのは、手元の環境がそうなっているからです。スミマセン。)

cat [前述のスクリプトで出力した一覧ファイル] | grep "Not Installed" | grep -v -e "Visual" -e "NET" -e "Silverlight" -e "Windows 10" -e "Skype" -e "用更新プログラム"

あとはパッチを探して個別インストールすればよいのですが、ただしこのまま実行するのは時間が掛かり過ぎます。この予防のためにWindows Update はデフォルトで停止とし、スタートアップを手動にしておきます。

f:id:pslabo:20160305103042p:plain


そしてWindows Updateを個別に一通りやってみました。アップデートをサボっていると件数がそれなりにありますから、個別インストールでも3時間程度の時間がかかってしまいました。別のPCがあるなら他の作業をしつつのんびり対応すべきですね。

この方法でアップデートしてみたら、アップデートはすべて成功してしまいました。つまり、問題箇所は前述のフィルタリングで除外したやつの中にいたわけですね。

そうすると未適用のアップデートは相当減っているはずですから、ここからは普通に全件をWindows Updateで一括適用することを試してみました。するとVisualStudio関連の3つだけが失敗し、残りはすべてインストールできました。

最終的には前述したとおり、KB3001652をインストールしたら他のKBが一覧から消えました。ここまでやるのに試行錯誤で3日くらいムダに使いました。今度からはせめて毎月1回はWindows Updateのために電源を入れることにします。。。