Dirk Diggler
например, из реестра... не понял насчет версий, как вариант - найти соотв. CAT-файл и восстановить его дату
Код:

#include <Array.au3>
$file = "C:\HotFixes.txt"
$aList = _GetHotFixes ()
$f = FileOpen ($file, 2)
For $i=1 To $aList[0][0]
FileWrite ($file, $aList[$i][0] & @CRLF & $aList[$i][1] & @CRLF & $aList[$i][2] & @CRLF & @CRLF)
Next
FileClose ($f)
Func _GetHotFixes ()
Local $i, $j, $k, $iKey, $jKey, $kKey
Local Const $root1 = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix"
Local Const $root2 = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates"
Local $arrList[1] = [0], $arrHFix[1][3] = [[0,0,0]]
$i=1
While True
$iKey = RegEnumKey ($root1, $i)
If @error Then ExitLoop
$arrList[0]+=1
ReDim $arrList[$arrList[0]+1]
$arrList[$arrList[0]] = $iKey
$i+=1
Wend
$i=1
While True
$iKey = RegEnumKey ($root2, $i)
If @error Then ExitLoop
$j=1
While True
$jKey = RegEnumKey ($root2 & '\' & $iKey, $j)
If @error Then ExitLoop
If _ArraySearch ($arrList, $jKey, 1) > 0 Then
$arrHFix[0][0] +=1
ReDim $arrHFix[$arrHFix[0][0]+1][3]
$arrHFix[$arrHFix[0][0]][0]=$jKey
$arrHFix[$arrHFix[0][0]][1]=$iKey
$arrHFix[$arrHFix[0][0]][2]=RegRead ($root2 & '\' & $iKey & '\' & $jKey, 'Description')
If @error Then $arrHFix[$arrHFix[0][0]][2]=RegRead ($root2 & '\' & $iKey & '\' & $jKey, 'PackageName')
ElseIf StringRegExp ($jKey, '^SP[1-9]$') Then
$k=1
While True
$kKey = RegEnumKey ($root2 & '\' & $iKey & '\' & $jKey, $k)
If @error Then ExitLoop
If _ArraySearch ($arrList, $kKey, 1) > 0 Then
$arrHFix[0][0] +=1
ReDim $arrHFix[$arrHFix[0][0]+1][3]
$arrHFix[$arrHFix[0][0]][0]=$kKey
$arrHFix[$arrHFix[0][0]][1]=$iKey
$arrHFix[$arrHFix[0][0]][2]=RegRead ($root2 & '\' & $iKey & '\' & $jKey & '\' & $kKey, 'Description')
If @error Then $arrHFix[$arrHFix[0][0]][2]=RegRead ($root2 & '\' & $iKey & '\' & $jKey, 'PackageName')
EndIf
$k+=1
Wend
EndIf
$j+=1
Wend
$i+=1
Wend
Return $arrHFix
EndFunc