tmori3y2のブログ

主にWindowsのプログラムなど

MBSAで作成したWindows 7 x64 (ほぼ初期状態)の更新リストのUpdateをPowerShellでダウンロード

2016/05/13 修正

tmori3y2.hatenablog.com

職場にVS2015 Pro with MSDNを入れようかと思って、Windows 7 UltimateとWindows 10 Professionalの仮想環境を作ろうと思ったが、Windows Updateに失敗するという話があったので、MBSAで作成した更新リストを使って、ホストOSからDISMで一括適用を出来ないか調べてみた。

technet.microsoft.com

インストールやコマンドの実行は、こちらのサイトを参考にした。

dolls.orz.hm

まあ、先ずはWindowsのセットアップ。

職場はホストがWindows 7 Professional x64だが、最近、Windows 10に対応したWindows ADK for Windows 10 バージョン 1511を最小構成でインストールした。(まだなら入れておくこと)

PowerShellでのWindows Updateファイルのダウンロードには、PowerShell 3.0以上が必要なので、無いならホストOSにインストールしておく。(今回は3.0がインストールされていたので、そのまま使用。まだなら4.0以上がお勧め)

職場はVirtualBoxだけど、仮想ハードディスクへのWindows 7 with SP1 (x64)の展開は、Windows 10とほぼ一緒・・・

tmori3y2.hatenablog.com

念のため、起動前にスナップショット(Hyper-Vで言うところのチェックポイント)を作成しておく。

キーボードの文字化けについても同じように対処して、IE11のインストールとMBSAに対応したWindows Updateエージェントのインストールを済ませる。

Windows Updateエージェントは、参考にしたサイトの以下のリンクのファイルに記載のURLから入手した。

http://update.microsoft.com/redist/wuredist.cab

(2016/05/18 最新版というのは誤り。MBSA 2.3リリース時点のものと思われる)

ここまでやったら、MBSAのインストール。

Download Microsoft Baseline Security Analyzer 2.3 (for IT Professionals) - 日本語 from Official Microsoft Download Center

参考にしたサイトの手順で、インストールが終わったら、コマンドラインで以下を実行すると失敗して、Cacheフォルダができるので、cabファイルをコピーしてから、再実行して更新ファイルのリストを作成する。

cd /d "c:\Program Files\Microsoft Baseline Security Analyzer 2"
mbsacli.exe /xmlout /unicode /nd /nvc > d:\mbsa\Update1st.xml
  • ホストOSに更新ファイルリストをコピー(d:\mbsa\Update1st.xml)
  • フォルダd:\WindowsUpdateを作成

出来たファイルのXPathが以下のものをダウンロドすれば良いようだ。

  • //UpdateData[IsInstalled='false']//DownloadURL

XMLスクリプトだと、PowerShellかな?多分・・・」

多分というのは、実はPowerShellは十指で数えるほどしか使っていない・・・

まあ、Google先生に聞けばよいので、xml powershellググる

tech.sanwasystem.com

morituriのブログ : powershellでXPathを使ってXMLファイルを読む

[xml]$xml = get-Content -Path d:\mbsa\Update1st.xml
$xnavi = $xml.CreateNavigator()

xml開いて、XPathNavigetorを作成してから、ダウンロード対象は151あるので、取り敢えずダウンロード済みの奴で、コマンドの確認をする。

$xnavi.Select("//UpdateData[@IsInstalled='true']/Title") | Select Value
Value
--------
MSXML 6.0 RTM セキュリティ更新プログラム (925673)
x64 ベース システム Windows 7 用 Internet Explorer 11
$xnavi.Select("//UpdateData[@IsInstalled='true']//DownloadURL") | Select Value
Value
--------
http://www.download.windowsupdate.com/msdownload/update/v3-19990518/cabpool/msxml6-kb925673-enu-amd64_cc347d98b9fe1e...
http://download.windowsupdate.com/c/msdownload/update/software/uprl/2013/10/wu-windows6.1-kb2533623-x64_40b1d8701721...

取り敢えずIE11がちゃんとインストールされているのが確認できた・・・

「あれ?切れる。コマンドライン文字数制限?・・・」

$navi.Select("//UpdateData[@IsInstalled='true']//DownloadURL") | Select Value | Out-File -FilePath d:\test.txt -Width 300

test.txt

Value
--------                                                                                                                                            
http://www.download.windowsupdate.com/msdownload/update/v3-19990518/cabpool/msxml6-kb925673-enu-amd64_cc347d98b9fe1e417cb73f0ddf004d1f94a4bfcf.exe  
http://download.windowsupdate.com/c/msdownload/update/software/uprl/2013/10/wu-windows6.1-kb2533623-x64_40b1d8701721bb016179d2fe1b42fb36594e4f86.exe

「うん、取れてる」

dev.classmethod.jp

あとは、ダウンロード。これも数の少ない適用済みのもので確認。

かなり早いし、ダウンロードする間は開発を中断する必要もないので、なかなかいいかもしれない。

$xnavi.Select("//UpdateData[@IsInstalled='true']//DownloadURL") | foreach-Object {Invoke-WebRequest -Uri "$_" -OutFile (Join-Path "d:\WindowsUpdate" (Split-Path $_ -Leaf))}

実際に、ダウンロードするときは、//UpdateData/@IsInstalled='false'でダウンロード。

ところで、適用済みは.exeファイルなんだな・・・

気になって、インストールされていないものの.exeを調べてみた。

$xnavi.Select("//UpdateData[@IsInstalled='false']//DownloadURL") | Select Value | where-Object {$_.Value.Contains("exe") }
Value
-----
http://download.windowsupdate.com/c/msdownload/update/software/secu/2015/01/mpsyschk_b2f2b1fe31b7ecec4ea43004bc4e2c7b7171b74f.exe
http://download.windowsupdate.com/d/msdownload/update/software/uprl/2016/05/windows-kb890830-x64-v5.36_8c158268afa40e58b2fc516...
http://download.windowsupdate.com/c/msdownload/update/software/secu/2015/01/mpsyschk_cb1fefac0669ab60ac983bda2202780a80a84d32.exe
http://download.windowsupdate.com/c/msdownload/update/software/secu/2014/11/mpsyschk_2bbd60758fb5fe3e070dc308b2c59bd2d36aacad.exe
http://download.windowsupdate.com/c/msdownload/update/software/secu/2014/04/mpsyschk_b6094da6a44231d66304c3912133742967b00f4f.exe
http://download.windowsupdate.com/d/msdownload/update/software/secu/2015/03/cleanupwindowsdefendertasks_89bb428f88ade6de4cf1f2...
http://download.windowsupdate.com/msdownload/update/software/secu/2012/04/mpsyschk_479a484f94dee6cf64dc9525129bb402693112db.exe
http://download.windowsupdate.com/c/msdownload/update/software/secu/2015/02/mpsyschk_0dfacff83493bec443c166008c5618afea04c729.exe

151の内、8つが.exe・・・

フォルダに年月があるから、フィルタしてDISMかけて、.exeはログインしてからインストールしたら良いんだろうか・・・

取り敢えず月曜までお預け。

Add-WindowsPackage

ちなみに、今回のリストはWindows 7 Ultimate with SP1 JPN x64の初回のUpdateの分なので使いまわしが出来るはずです。

BlogSamples/Update1st.xml at Article_20160514A · tmori3y2/BlogSamples · GitHub

Update後に追加される分も含めて、公開していきますので、よかったら再利用してください。