VBScript

Windows Updateの更新履歴をCSV(UTF-8)で保存するVBScript

以前書いたスクリプトが出てきました。
Windows Updateの更新履歴を

“更新日時”,”コンピューター名”,”ユーザー名”,”タイトル”,”KB番号”,”結果”

といった形式のCSVファイルとして出力するスクリプトです。

Option Explicit

Dim dir_path, cn, ymd

dir_path = "" 'CSVファイルの出力先指定

If Len(Trim(dir_path)) < 1 Then _
   dir_path = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
dir_path = AddPathSeparator(dir_path)

cn = CreateObject("WScript.Network").ComputerName
ymd = Year(Now()) & Right("0" & Month(Now()), 2) & Right("0" & Day(Now()), 2)
OutputMSUpdateInfo dir_path & ymd & "_MSUP_" & cn & ".csv"

Public Sub OutputMSUpdateInfo(ByVal TxtFilePath)
'Windows Updateの更新履歴をCSV(UTF-8)で保存
  Dim str
  Const adTypeText = 2
  Const adSaveCreateOverWrite = 2
  
  str = GetMSUpdateInfo
  If Len(Trim(str)) > 0 Then
    With CreateObject("ADODB.Stream")
      .Type = adTypeText
      .Charset = "UTF-8"
      .Open
      .WriteText str
      .SaveToFile TxtFilePath, adSaveCreateOverWrite
      .Close
    End With
  End If
End Sub

Private Function GetMSUpdateInfo()
'Windows Updateの更新履歴取得
  Dim us 'WUApiLib.UpdateSession
  Dim sr 'WUApiLib.UpdateSearcher
  Dim uhec 'WUApiLib.IUpdateHistoryEntryCollection
  Dim uhe 'WUApiLib.IUpdateHistoryEntry
  Dim rs
  Dim kb, rc
  Dim cn, un
  Dim cnt
  Dim ret
  Const adVarChar = 200
  Const adDBTimeStamp = 135
  
  Set us = CreateObject("Microsoft.Update.Session")
  Set sr = us.CreateUpdateSearcher
  
  cnt = sr.GetTotalHistoryCount
  If cnt < 1 Then Exit Function
  
  'コンピューター名とユーザー名取得
  With CreateObject("WScript.Network")
    cn = .ComputerName
    un = .UserName
  End With
  
  'レコードセット設定
  Set rs = CreateObject("ADODB.Recordset")
  rs.Fields.Append "Date", adDBTimeStamp, 255
  rs.Fields.Append "ComputerName", adVarChar, 255
  rs.Fields.Append "UserName", adVarChar, 255
  rs.Fields.Append "Title", adVarChar, 255
  rs.Fields.Append "KB", adVarChar, 255
  rs.Fields.Append "Result", adVarChar, 255
  rs.Open
  
  Set uhec = sr.QueryHistory(0, cnt)
  For Each uhe In uhec
    kb = UCase(uhe.Title)
    If InStr(kb, "KB") Then
      kb = Mid(kb, InStr(kb, "KB"))
      kb = Left(kb, InStr(kb, ")") - 1)
    Else
      kb = ""
    End If
    
    'OperationResultCode enumeration
    'https://msdn.microsoft.com/en-us/library/windows/desktop/aa387095.aspx
    Select Case uhe.ResultCode
      Case 0: rc = "NotStarted"
      Case 1: rc = "InProgress"
      Case 2: rc = "Succeeded"
      Case 3: rc = "SucceededWithErrors"
      Case 4: rc = "Failed"
      Case 5: rc = "Aborted"
      Case Else: rc = ""
    End Select
    
    rs.AddNew
    rs.Fields("Date").Value = uhe.Date
    rs.Fields("ComputerName").Value = cn
    rs.Fields("UserName").Value = un
    rs.Fields("Title").Value = uhe.Title
    rs.Fields("KB").Value = kb
    rs.Fields("Result").Value = rc
    rs.Update
  Next
  rs.Sort = "Date DESC" '日付で降順ソート
  rs.MoveFirst
  Do Until rs.EOF
    ret = ret & _
          ChrW(34) & rs.Fields("Date").Value & ChrW(34) & ChrW(44) & _
          ChrW(34) & rs.Fields("ComputerName").Value & ChrW(34) & ChrW(44) & _
          ChrW(34) & rs.Fields("UserName").Value & ChrW(34) & ChrW(44) & _
          ChrW(34) & rs.Fields("Title").Value & ChrW(34) & ChrW(44) & _
          ChrW(34) & rs.Fields("KB").Value & ChrW(34) & ChrW(44) & _
          ChrW(34) & rs.Fields("Result").Value & ChrW(34) & vbNewLine
    rs.MoveNext
  Loop
  rs.Close
  ret = Left(ret, InStrRev(ret, vbNewLine) - 1) '最後の改行削除
  GetMSUpdateInfo = ret
End Function

Private Function AddPathSeparator(ByVal s)
  If Right(s, 1) <> ChrW(92) Then s = s & ChrW(92)
  AddPathSeparator = s
End Function

多数の端末のWindows Update履歴を、一台一台確認するのが面倒くさかったので書いたような記憶があります。

VBScriptからのWindows Updateの取り扱いについては下記Webページに詳しくまとめられているので、興味がある方はそちらをご参照ください。

映画『夜は短し歩けよ乙女』感想前のページ

大英自然史博物館展に行ってきたよ。次のページ

関連記事

  1. VBScript

    指定したフォルダ内で最も更新日時の新しいファイルのパスを取得するVBScript

    大量のログファイルから最新のファイルのみを取得する必要があったので、簡…

  2. VBScript

    GUIDを作成するVBScript

    Office アドインを作成するのに必要(マニフェストのId要素)なG…

  3. Windows関連

    Lhaplusのバージョンを取得するVBScript

    およそ2年ぶりに圧縮・解凍ソフトの「Lhaplus」がバージョンアップ…

  4. VBScript

    指定したフォルダ内のemlファイルの情報をリスト化するVBScript

    emlファイルから件名や本文、宛先や送信日時といった各種情報を取得して…

  5. Windows関連

    OSのバージョン情報をクリップボードにコピーするVBScript

    OSのバージョンやビルド番号をブログの記事内に書くことがあるのですが、…

  6. Office関連

    KB2553154の更新プログラムをアンインストールするVBScript

    2014/12/11 追記:当記事で紹介しているのは更新プログラム…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP