以前、Winows7上で一度もネットワークに繋がずにWindowsUpdateを適用する「MBSAを使用したWindowsUpdateのオフライン適用」について書きました。おかげさまで非常に多くの方にお読みいただいています。
そこからもう4年も経った為、ビジネスでも主流となりつつあるWindows10にて同様にオフラインアップデートが可能か検証してみました。
はじめに
「WindowsUpdateをオフラインで当てたい」というのは大抵はお客様の要望だったり、こちらから「最新版まで適用済み」と納入時に書くのが目的でしょう。
そうなると具体的なゴールは「WindowsUpdateを実行しても『このWindowsは最新です』と表示されて追加アップデートが表示されないこと」になると思います。
今回、過去にやった手法のままこの状態まで仕上げられるかを順を追って検証しました。
その点だけでいえば結果は「ノー」です。
チェック
MBSAは2.3が最新
Microsoft Baseline Security Analyzer
最新バージョンは2.3はWindows8.1までしか対応リストにないため、Windows10は正式には非対応という事になります。ですが、インストール自体は問題はありません。
インストール後、チェックに使うカタログファイル(wsusscn2.cab)を用意する必要があります。MSのサイトからダウンロードすることもできますが、ネット接続可能な検証機があるなら一度MBSAを実行すると
%USERPROFILE%\AppData\Local\Microsoft\MBSA\Cache
に最新のwsusscn2.cabが保存されるのでそれでもOK。手動でダウンロードしたものと同一でした。
こうしてできたファイル3つ
- mbsacli.exe(MBSAフォルダより)
- wusscan.dll( 〃 )
- wsusscn2.cab
を適当なフォルダに入れます。
チェック実行
コマンドプロンプトを管理者モードで開きます。通常モードで行うと「セキュリティのCABファイルが読み込めません」と表示されエラーになるので注意。
上記ファイルを入れたフォルダに異動したのち、MBSAのCLI版を実行します。
>mbsacli.exe /xmlout /unicode /catalog wsusscn2.cab > Updatecheck.xml Microsoft Baseline Security Analyzer Version 2.3 (2.3.2211.0) (C) Copyright 2002-2013 Microsoft Corporation. All rights reserved. >
これでアップデートの有無がUpdatecheck.xmlとして書き出されました。
確認
XMLファイルの解読
出来上がったUpdatecheck.xmlはメモ帳でもブラウザでも表示できます。その中から
IsInstalled=”false”
と表示されているアップデートをインストールすればいいわけです。
ただし数が多くなってくると目でチェックするのはどうにもしんどい。なのでこの”IsInstalled”をキーとして必要なアップデートのURLのみを抜き出したテキストファイルを作ります。リストができればあとは手なりツールなりでダウンロード。
XMLファイルからの抜き出しは別途アプリ利用せずにPowerShellでやってみました。
(参考:PowerShellでXMLファイルの内容を検索する – Sanwa Systems Tech Blog)
管理モードでPowerShellを開き、Updatecheck.xmlのあるフォルダに移動してから以下を実行します。
$xml = [XML](Get-Content Updatecheck.xml) $xml.XMLOut.Check.Detail.UpdateData | Where-Object {$_.IsInstalled.Contains("false")} | Select-Object {$_.References.DownloadURL} | Out-File downloadlist.txt
1行目で.xmlファイルを読み込み。2行目で各要素のIsInstalledがfalseとなっているアップデートを見つけて、そこからDownloadURLを抜き出し、downloadlist.txtにファイルに出力しています。
これでdownload.txtに必要なファイルのダウンロードURLがリストアップされます。
> type .\downloadlist.txt $_.References.DownloadURL ------------------------- http://download.windowsupdate.com/msdownload/update/software/secu/2011/05/vcredist_x64_a7c83077b8a28d409e36316d2d7321fa0ccdb7e8.exe http://download.windowsupdate.com/d/msdownload/update/software/uprl/2016/08/windows-kb890830-x64-v5.39_699bf47d2326fdd390f2f1770e1a982fa1538055.exe http://download.windowsupdate.com/d/msdownload/update/software/secu/2016/08/windows10.0-kb3176495-x64_ab6bf25bc8f2ac8f2fd14cfb99ac8c90c5bb8c48.cab
この時、注意としてPowerShellのウィンドウが小さいとURLの最後が”…”で省略されてしまいます。ウインドウを出来る限り広げるほか、完成したファイルを確認してURLに拡張子まで含まれている事を確認しましょう。
ダウンロードは
自分はJDownloaderで一括ダウンロードしましたが、怪しいソフト(アドウェアが入っているパッケージが出回っていたり)なので、環境と相談して他のツールも考慮して下さい。
PowerShellでもInvoke-WebRequestコマンドレットを使う事でバッチ形式でダウンロードする事ができます。
一括適用
用意したファイルを実際のマシンに適用していきます。
ファイルは”.exe”,”.msu”,”.cab”の三種類。過去記事ではファイルを分解して一個一個・・・なんてやってましたが、素晴らしい方法を公開されている方がいました。
オフライン環境でWindows Updateのパッチを適用する方法(MBSA) – ピピローグ
■.msu
forfiles /p . /m *.msu /c “cmd /c wusa @path /quiet /norestart”■.exe
forfiles /p . /m *.exe /c “cmd /c @path /quiet /norestart”■.cab
forfiles /p . /m *.cab /c “cmd /c dism /online /add-package=@path /norestart”
forfilesコマンドを使ってフォルダ内の対象拡張子を一気に処理しています。
全部のアップデートを一つのフォルダに入れた後、コマンドプロンプトで上記3行を実行すればOK。
一つ注意として.exe用コマンドはディレクトリ内の全てのexeを実行するため、実行時のカレントディレクトリに注意するのと、アップデータ以外のexeが入っていない事を確認しておきましょう。
実行結果
注目の結果確認です。
サンプルとして”Windows 10 Enterprise Evaluation Build 4393.rs1_release.160805-1735”のVMを用意し、バックアップ&リストアしながら検証しました。
普通にアップデートした場合
対象のVMに「アップデートはありません」と表示されるまでWindowsUpdateを実行します。その状態を確認しました。
C:\Windows\system32>wmic qfe Caption CSName Description FixComments HotFixID InstallDate InstalledBy InstalledOn Name ServicePackInEffect Status http://support.microsoft.com/?kbid=3176936 DESKTOP-NG83N0L Update KB3176936 NT AUTHORITY\SYSTEM 8/29/2016 http://support.microsoft.com/?kbid=3176934 DESKTOP-NG83N0L Update KB3176934 NT AUTHORITY\SYSTEM 8/29/2016
KB3176936とKB3176934が適用さてています。この状態までMBSAの組み合わせで実行できれば良いことになります。
MBSAでアップデートした場合
一度VMをリストアしてMBSA実行しました。カタログ同期日時は” 2016-08-09T02:44:56Z”です。結果、検出された「適用の必要のあるアップデート」は3つ。
- MS11-025 Microsoft Visual C++ 2008 Service Pack 1 再頒布可能パッケージのセキュリティ更新 プログラム (KB2538243)
- MS16-095 x64 ベース システム用 Windows 10 Version 1607 の累積的な更新プログラム (KB3176495)
- 890830 Windows 8、8.1、10 と Windows Server 2012、2012 R2 x64 エディション用の、Windows 悪意のあるソフトウェア削除ツール – 2016 年 8 月 (KB890830)
これを手動て適用した結果
- KB2538243:MBSAではvcredist_x64を指定されるが、実際はvcredist_x86を探して入れないと解消されない。
- KB3176495:普通に適用できた。wmic qfeでも表示される。
- KB890830:インストールされるがwmic qfeでは結果表示されない。
そしてKB3176936とKB3176934は検出すらされない。
つまり、Windows10でMBSAでオフラインインストールしても、手動で行ったオンラインWindwsUpdateと同じアップデート結果にはならない。
あとがき
今回の結果が全ての環境に当てはまる、とは断言できませんが概ね結果は同じような気がしています。試しにAnniversary Updateが当たる前の環境で試すと10個程が検出されますが、MBSAでは変わらず上記3つしか候補に出しません。
そうなる原因として考えられるのは
- 配布カタログファイルとWindows10がマッチしてない
- 参照するカタログが別にある
- そもそも自分のMBSAの使い方が間違えている
くらいしか思いつきません。
結論を出すまで長々書きましたが、単なるMBSAの適用方法としては4年前よりも大分洗練できたと思います。Windows8.1までであれば有効な手順なのでまだまだ利用する場面も出てくるのではないかと。
Windows10に関して新しいツール、手法が出てないかはもうちょっと探してみます。もし見つかれば今後必要になると思うので試してみなくては。
ぶっちー様、とても参考になる記事をありがとうございます。
早速私もここやもう一つの記事などの手順に従い
Windows7 64bit HomePremiumにおいて
挑戦いたしましたが
$xml.XMLOut.Check.Detail.UpdateData | Where-Object {$_.IsInstalled.Contains(“false”)} | Select-Object {$_.References.DownloadURL} | Out-File downloadlist.txt
がなぜか成功しませんでした。
Windowsのコマンドに関しましては私はほとんど知識がないため、途方に暮れそうになりました。
https://okwave.jp/qa/q9361645.html
に質問を投稿しております。見ていただけると大変ありがたいです。
▽DING2さま
訪問ありがとうございます。
こちらではDING2さまのエラーの内容に対応する事はできません。
しかし、正しく.xmlを作成されているようなので、あとは無理に
URLの抜き出しを自動化する必要は無いようにも思えます。
投稿中に記載してあるとおり、
IsInstalled=”false”
が含まれているアップデートを目で見つけて、URLをコピーしてダウンロードすれば同じ結果が得られます。
私がコマンドでやろうとしてるのはただの横着です。
ぶっちー様、とても参考になる記事をありがとうございます。
早速私もここやもう一つの記事などの手順に従い挑戦いたしました。
forfilesを用いた一括適用のくだりですが、
まず、” が全角文字になっていますので、半角に修正しておいて下さい。
それと、コマンドプロンプトでは動いてくれず、PowerShellでうまくいきました。
”のご指摘ありがとうございます。
ただ全角になるのは引用の仕様ですので、読み替えて利用をお願いします。
“管理モードでPowerShellを開き”と書いてある部分はPowerShellで実行をお願いします。
その他はコマンドプロンプトで動くのを確認済みです。
ぶっちー様、コメントへの返信ありがとうございます。
お手間をとらせましたようで申し訳ありません。
確かにひとつひとつURLをコピーしてもいいかもしれません。