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