2012年11月16日金曜日

[Script][VBS]Windows Update を適用する VBS

Windows Update は毎月第二火曜にリリースされるマイクロソフト製品の更新プログラム適用の仕組みです。 アメリカを基準としているために日本は時差の関係で水曜になりますが、第二火曜の翌日の水曜となるために第二水曜とは限らず第三水曜になることもあります。

この  Windows  Update を適用する方法は「ブラウザを使ってWeb で Windows Update サイトにアクセスしてアップデートをする」、「タスクトレイに表示された Windows Update のアイコンをクリックして適用する」、「自動適用にしておき、シャットダウンに合わせてインストールする」など、設定にもよりますがやり方がいくつかあります。


ここに載せているのはスクリプトから Windows Update の適用を行う方法です。スクリプト言語はVB スクリプトになります。

スクリプトは3つあってそれぞれの使い方は下記のようになっています。

・WUA_Check_Update.vbs
WSUS サーバにアクセスし、未適用パッチの一覧を表示します。

・WUA_Search_Download_Install.vbs
WSUS サーバにアクセスして未適用パッチの有無をチェックします。未適用パッチがある場合にはパッチのダウンロードをします。その後コンソール上で "Y" を入力するとパッチを適用します。 ※Windows 2008 で実行する場合には注意があります。

・WSUA_Search_Update.vbs
マシン上にインストールしてある適用済みパッチの一覧を表示します。 各パッチがいつインストールしたかも表示しますので、スクリプトを修正すれば最後にパッチを適用した日を取得するといった使い方もできます。


スクリプトの実行

スクリプトの実行はコマンドプロンプトで cscript  "スクリプトファイル名" です。

タスクトレイからパッチ適用のダイアログを使って実施するのと時間は(多分)変わらないと思います。しかし進捗を表示するプログレスバーが無いため、長く感じるかもしれません。私がそうでした。

それでも何故このようなスクリプトが必要になったかというと、リモートデスクトップでWindowsマシンにログインしたとき、タスクトレイ上にMicrosoft Updateのアイコンが表示されないことがあり、その場合にはパッチを適用することができないからです。

 

Windows 2008 で WUA_Search_Download_Install.vbs を実行する場合の注意点

Windows 2008 で WUA_Search_Download_Install.vbs を実行した場合、実行途中で 0x80240044 エラーが発生することがあります。この場合はコマンドプロンプトを管理者として実行する必要があります。
 

VB スクリプト

以下がVBスクリプトです。 テキストで貼り付けて作成してください。

WUA_Check_Update.vbs
Set objUpdateSession = CreateObject("Microsoft.Update.Session")
Set objUpdateSearcher = objUpdateSession.CreateupdateSearcher( )
WScript.Echo "更新ファイルを検索しています..."
strSeatchCondition = "IsInstalled=0"
Set objSearchResult = objUpdateSearcher.Search( strSeatchCondition ) 

Wscript.Echo
WScript.Echo "未適用の更新ファイル一覧" 
Wscript.Echo "-------------------------------------------------"
Wscript.Echo "見つかった更新ファイルの数:" & objSearchResult.Updates.Count 
Wscript.Echo

Set objUpdateCollection = objSearchResult.Updates

For i = 0 To objUpdateCollection.Count-1
    strType = ""
    strCategory = ""
    strTitle = ""
    strDescription = ""

    Set objUpdate = objUpdateCollection.Item( i )

    Select Case objUpdate.Type
      Case 1 strType = "Software"
      Case 2 strType = "Driver"
      Case Else strType = "NA"
    End Select

    Set objCategories = objUpdate.Categories
    For cntCategory = 0 to objCategories.Count - 1
      strCategory = strCategory & "[" & objCategories.Item(cntCategory) & "]"
    Next

    strDescription = objUpdate.Description
    strTitle = objUpdate.Title
    WScript.Echo strTitle
    Wscript.Echo "   タイプ    " & chr(9) & ":" & strType 
    Wscript.Echo "   カテゴリ " & chr(9) & ":" & strCategory 
    Wscript.Echo "   説明     " & chr(9) & ":" & strDescription
    Wscript.Echo
Next

If objSearchResult.Updates.Count = 0 Then
    WScript.Echo "未適用の更新ファイルはありません."
    WScript.Quit
End If

WUA_Search_Download_Install.vbs
Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()
WScript.Echo "Searching for updates..." & vbCRLF
Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software'")
WScript.Echo "List of applicable items on the machine:"
For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
End If

WScript.Echo vbCRLF & "Creating collection of updates to download:"
Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")

For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> adding: " & update.Title 
    updatesToDownload.Add(update)
Next

WScript.Echo vbCRLF & "Downloading updates..."
Set downloader = updateSession.CreateUpdateDownloader() 
downloader.Updates = updatesToDownload
downloader.Download()
WScript.Echo  vbCRLF & "List of downloaded updates:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    If update.IsDownloaded Then
        WScript.Echo I + 1 & "> " & update.Title 
    End If
Next

Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")
WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title 
       updatesToInstall.Add(update)
    End If
Next

WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo 

If (strInput = "N" or strInput = "n") Then 
    WScript.Quit
ElseIf (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()
    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode 
    WScript.Echo "Reboot Required: " & _ 
    installationResult.RebootRequired & vbCRLF 
    WScript.Echo "Listing of updates installed " & _
    "and individual installation results:" 
    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode
    Next
End If

WSUA_Search_Update.vbs
SearchString = ""
Set objSession = CreateObject("Microsoft.Update.Session")
Set objSearcher = objSession.CreateUpdateSearcher
intCount = objSearcher.GetTotalHistoryCount

If intCount > 0 then
    Set colHistory = objSearcher.QueryHistory(0, intCount)
    WScript.Echo "Date Title"
    WScript.Echo "---- -----"
    For Each objHistory In colHistory
        If (objHistory.HResult = 0) AND (InStr(objHistory.Title,SearchString) > 0) then
            WScript.Echo Mid(objHistory.Date,1,19) & " " & objHistory.Title
        End If
    Next
End If


Script のページに戻る

2 件のコメント:

  1. WUA_Check_Update.vbsをcmdから実行するとコンパイル エラー: ステートメントの末尾が不正です。と言われます

    返信削除
    返信
    1. コメントありがとうございます。

      エラーとなっているのは以下の部分でした。
      Set objUpdateSearcher = objUpdateSession.CreateupdateSearcher( ) WScript.Echo "更新ファイルを検索しています..."
      →WScript.Echo の前に改行が必要

      直しておきましたので今度は大丈夫だと思います。

      削除