Windows
windowsUpdateのサイレントインストールをしてみる。
はち
更新日:2021/08/11
情シスをやっていると新入社員が入社する毎にPCのセットアップをすることがよくあると思います。
そういう時、セットアップしなおしたPCにウインドウズアップデートを当てなおして何度も再起動をおこなわないといけません。
このために何時間おきにPCの前に立ちWindowsUpdateをおこないたくないので、WindowsUpdateのサイレント・インストールの仕組みを実装したいと思います。
サイレントインストールを実行し処理が終了する頃には全てのwindowsupdateがあたっているようにします。
※対象環境は、windows7SP1とします。
サイレントインストールの下準備
下準備1:windows7にSP1をあてる
※3年以内に購入されたPCにならほぼSP1が入ったWindows7だと思いますのでSP1が入ってないPCにはSP1をあててください。
SP1あてる用のディスクをisoファイルから作成しておくのが一番早いと思います。
参考サイト
https://www.microsoft.com/ja-jp/download/details.aspx?id=5842
下準備2:Microsoft Baseline Security Analyzer(MBSA)をインストールする
「MBSA」とはマイクロソフト提供のツールで未適用のセキュリティパッチをリストアップをおこなえる。
MBSAを同時にサイレントインストールもできるのですが、キレイにインストールされずに動かない場合があるので手動でインストールをオススメします。
参考サイト
https://www.microsoft.com/ja-jp/download/details.aspx?id=7558
下準備3:Wsusscn2.cab をダウンロード
最新のパッチ情報(カタログ・ファイル)のWsusscn2.cabをダウンロードします。
参考サイト
http://go.microsoft.com/fwlink/?LinkID=74689
下準備4:wget.exe をダウンロード
適応したいパッチを一括でダウロードするのに必要なのでダウンロードしておきます。
参考サイト
http://www.seotemplate.biz/free-seo/2203/
wsusscn2.cabのファイルを作業環境に設置
rem ----- wsusscn2.cab保存フォルダ作成 ----- mkdir "%USERPROFILE%\AppData\Local\Microsoft\MBSA\Cache" rem ----- wsusscn2.cabフォルダにコピー ----- copy /y wsusscn2.cab "%USERPROFILE%\AppData\Local\Microsoft\MBSA\Cache\wsusscn2.cab"
☆1.Microsoft Baseline Security Analyzer(MBSA) の実行 対象ファイルをupdateFile.xmlに書き出す
rem ---- MBSA の実行 対象ファイルをupdateFile.xmlに書き出す ----- "%PROGRAMFILES%\Microsoft Baseline Security Analyzer 2\mbsacli.exe" /xmlout /unicode /nd /nvc /catalog %USERPROFILE%\AppData\Local\Microsoft\MBSA\Cache\wsusscn2.cab >updateFile.xml
☆2.vbscriptでテキスト処理
対象端末にあてる必要があるパッチが「updateFile.xml」に書き出されます。
このファイルからパッチのURL部分だけ抜き出したいのでテキストを抜き出す処理のvbscriptを作製します。
var wsh = new ActiveXObject("WScript.Shell");
var strFileXML = "updateFile.xml";
var strFileTXT = "urllist.txt";
//正規表現パターン
var regPattern00 = /(<UpdateData.*?>)([^<]*)(<\/UpdateData>)/ig;
var regPattern01 = /IsInstalled\=\"false\"/i;
var regPattern02 = /(<DownloadURL>)([^<]*)(<\/DownloadURL>)/ig;
//XMLをテキストモード(UTF-16) で読み込みファイルとして開く
objXML = new ActiveXObject( "ADODB.Stream" );
objXML .Type = adTypeText;
objXML .charset = "utf-16";
objXML .Open();
objXML .LoadFromFile( strFileXML );
//結果要ファイル「urllist.txt」の設定
objTXT= new ActiveXObject( "ADODB.Stream" );
objTXT.Type = adTypeText;
objTXT.charset = "utf-8";
objTXT.Open();
while ( !objXML .EOS ) { // ベースとなる「strFileXML」がなくなるまで読む
// 一行毎に読み込み
strText = objXML .readText( -2);
//<UpdateData>~</UpdateData>が含まれる行が見つかった場合に以下を実行
if( strTextJA.match( regPattern00 ) ) {
//IsInstalled=falseが含まれる行が見つかった場合に以下を実行
if( strTextJA.match( regPattern01 ) ) {
//<DownloadURL>~</DownloadURL>が含まれる部分のテキスト取得
var bar = strTextJA.match(regPattern02);
//<DownloadURL>~</DownloadURL>部分を除去
bar = String(bar).replace( regPattern02, "$2\n" );
if(bar != ""){
//テキストをつなぎあわせる
resultList = resultList + bar;
}
}
}
}
//テキストのゴミ取り
resultList = String(resultList).replace( /undefined/ig,"");
resultList = String(resultList).replace( /,/ig,"");
// 処理完了後、ファイルを保存
objTXT.WriteText( resultList, 1);
objTXT.SaveToFile( strFileTXT, 2);
// 各ストリームを閉じる
objTXT.Close();
objXML.Close();
WScript.Quit( 0 );
☆3.wget.exeを使い「urllist.txt」内のURLからファイルをダウンロードしパッチを適用していく
rem ----- 適応するパッチのダウンロード----- for /f %%I in (urllist.txt) do ( wget.exe %%I --no-check-certificate ) rem ----- .cab ファイルの一括適用----- forfiles /m *.cab /s /c "cmd /c dism /online /add-package=@path /norestart" rem ----- .exe ファイルの一括適用----- forfiles /m *.exe /c "cmd /c @file /q /norestart" shutdown -r -t 10
windows再起動と☆1~☆3の処理を「urllist.txt」の中身が空ファイルになるまで繰り返しす処理を作成する。
※スタートアップにでも仕込んで下さい。
以上をやることで実行すると、windowsUpdate最新版まで反映させることができます。