B3S
menu close

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最新版まで反映させることができます。