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