Here is an OLD script I wrote back in the day, gathers software from HKLM, HKCU and WMI:
 Code:
$=SetOption('Explicit','On')
Global $NameArray[], $VenArray[], $VerArray[]

Function GetSoftReg($uninstall)
  Dim $i, $key, $x, $y, $ven, $ver
  $i = 0
  While EnumKey($uninstall,$i) <> "" And @ERROR = 0
    $key = EnumKey($uninstall,$i)
    $x = ReadValue($uninstall+$key,'DisplayName')
    If $x <> ""
      $ver = ReadValue($uninstall+$key,'DisplayVersion')
      $ven = ReadValue($uninstall+$key,'Publisher')
      If $ven = "" $ven = "NA" EndIf
      If $ver = "" $ver = "NA" EndIf
      $y = UBound($NameArray) + 1
      ReDim Preserve $NameArray[$y]
      ReDim Preserve $VerArray[$y]
      ReDim Preserve $VenArray[$y]
      $NameArray[$y] = $x
      $VerArray[$y] = $ver
      $VenArray[$y] = $ven
      ;? $NameArray[$y]
    EndIf
    $i = $i + 1
  Loop
EndFunction

;Reg: 'DisplayName','DisplayVersion','Publisher'
;WMI: 'Name','Vendor','Version'

Function GetSoftWMI
  Dim $objWMIService, $colItems, $objItem, $itm, $chk, $y, $x, $ven, $ver
  $objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  $colItems = $objWMIService.ExecQuery("Select * from Win32_Product",,48)
  For Each $objItem in $colItems
    $chk = "False"
    For Each $itm in $NameArray
      If $itm = $objItem.Name
        $chk = "True"
      EndIf
    Next
    If $chk = "False"
      $ver = $objItem.Version
      $ven = $objItem.Vendor
      If $ven = "" $ven = "NA" EndIf
      If $ver = "" $ver = "NA" EndIf
      $y = UBound($NameArray) + 1
      ReDim Preserve $NameArray[$y]
      ReDim Preserve $VerArray[$y]
      ReDim Preserve $VenArray[$y]
      $NameArray[$y] = $objItem.Name
      $VerArray[$y] = $ver
      $VenArray[$y] = $ven
    EndIf
  Next
EndFunction

GetSoftReg("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\")
GetSoftReg("HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\")
GetSoftWMI

$=RedirectOutput("D:\Software.log")
Dim $i
For $i = 0 to UBound($NameArray)
  ? $NameArray[$i]
Next