Windows Updateの最終確認日時、インストール日時をVBScriptで取得する

Windows10,及びWindows7,8で、Windows Updateが行われているか確認するために、最終確認日時インストール日時を取得するスクリプトを書いたのでメモしておきます

◆ポイント

1)Windows10ではXMLファイル、Windows7,8はレジストリに最終確認日時、インストール日時が保管されている

2)Windows10のXMLファイルは下記のフォルダーにあるが、ファイル名が固定では無いようです
なので、下記のバッチファイルを作成し、固定のファイル名にコピーしてから読み込み処理を行うようにしました

type C:\ProgramData\USOPrivate\UpdateStore\updatestore*xml > d:\Win10UpdateInfo.xml

3)Windows10の日時の値の計算方法

これは、ややこしいです(><)

XMLファイルには1600年からの通算μ秒で記録されており、PowerShellで日時に変換できる
これをVBSで日付に変換したい
VBSは1900年からの通算秒で管理しているため、日数に変換してから300年マイナスしてやる必要がある
実際の計算式の、300年マイナスするところは逆算して求めた

4)Windows7,8のレジストリの読み込みは、たまに失敗するので、読み込みできたか確認してやる必要がある
自分が嵌ったのがこれで、「あやめ」経由で自動実行させようと思ったが、なぜか読み取り失敗するんですね トホホ
結局、スタートアップに登録して実行させることにしました

◆Windows10の日時の計算検証用

'PowerShellで日付に変換してみる
'(Get-Date 132077056626943692).AddYears(1600).AddHours(9)
'2019年7月16日 8:07:42

'VBSで日付に変換する
a="132077056626943692"
msgbox "文字列で取込: "&a
dt = cdbl(a) / 10000000
dd = dt/(24*3600)-109204.62500803665
msgbox "VBSのタイムスタンプに変換: "&dd  '43662.3386805556
msgbox "書式化: "&formatdatetime(dd)  '2019/07/16 8:07:42

'VBSでタイムスタンプ値を求める
a=datevalue("2019/07/16") + timevalue("8:07:42")
msgbox formatdatetime(a)
dt = cdbl(a)
msgbox "倍精度浮動小数点に変換: "& dt
msgbox "書式化: "  & formatdatetime(dt)

◆win10_update_infofile_copy.bat

type C:\ProgramData\USOPrivate\UpdateStore\updatestore*xml > d:\Win10UpdateInfo.xml

◆win10_update_infofile_copy.vbs

On Error Resume Next
Dim WMI, OS, Value, Shell

do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
    Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
    For Each Value in OS
    if left(Value.Version, 3) < 6.0 then exit do
    Next
    Set Shell = CreateObject("Shell.Application")
    Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"
    WScript.Quit
loop

Dim wsh, computername, username
Dim objFSO, objFile, objText 

Set wsh = WScript.CreateObject("WScript.Shell")

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("d:\Win10UpdateInfo.txt",2 ,true)

  strFile="d:\Win10UpdateInfo.xml"

  if objFSO.FileExists(strFile) = true then

    Dim dt
    Set objText = objFSO.OpenTextFile(strFile)
    sData = objText.ReadALL

    str="最終確認日時: "
    dt= cdbl(Mid(sData,InStr(sData,"<LastUpdateCheckTime")+35,18))
    dt= (cdbl(dt)/10000000)/(24*3600)-109204.625008003665
    str=str + formatdatetime(dt)

    str = str + " インストール日時: "
    dt= cdbl(Mid(sData,InStr(sData,"<LastUpdateInstallTime")+37,18))
    dt= (cdbl(dt)/10000000)/(24*3600)-109204.625008003665
    str=str + formatdatetime(dt)

    str = str + " 更新オプション: "
    str = str + Replace(Mid(sData,InStr(sData,"<UXActiveHoursStart")+34,2),"<","")
    str = str + " "
    str = str + Replace(Mid(sData,InStr(sData,"<UXActiveHoursEnd")+32,2),"<","")

    objFile.Write(date() & " " & time() & " " & str & vbCrLf)

    objText.Close
    Set objText = Nothing

  end if

objFile.Close
Set objFile = Nothing
Set objFSO = Nothing
Set wsh = nothing

◆win78_update_info_copy.vbs

'管理者権限
On Error Resume Next
Dim WMI, OS, Value, Shell
WScript.Sleep(2000)
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
    Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
    For Each Value in OS
    if left(Value.Version, 3) < 6.0 then exit do
    Next
    Set Shell = CreateObject("Shell.Application")
    Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"
    WScript.Quit
loop

Dim wsh
Dim objFSO, objFile, objText 
Dim str,st1,st2,st3

Set wsh = WScript.CreateObject("WScript.Shell")

st1 =      wsh.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Results\Detect\LastSuccessTime")
st2 =      wsh.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Results\Install\LastSuccessTime")
st3 = CStr(wsh.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\AUOptions"))

if (st1 <> "") and (st2 <> "") and (st3 <> "")  then

  Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
  Set objFile = objFSO.OpenTextFile("d:\Win78UpdateInfo.txt",2 ,true)

  str="最終確認日時: "
  str = str + st1
  str = str + " インストール日時: "
  str = str + st2
  str = str + " 更新オプション: "
  str = str + st3
  objFile.Write(date() & " " & time() & " " & str & vbCrLf)

  objFile.Close
  Set objFile = Nothing
  Set objFSO = Nothing

end if
Set wsh = nothing


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です