I changed the order of some of the code to follow the Description, Variable Declaration, Variable Definition, Main Code, Function Definition sequence. You still had some code that is intermingled with the UDFs... the code related to determining the CD Key contains Allen's example code and his UDFs. You need to review how the UDF and his example code works as right now, I think you will only get the last CD Key found added to the database.

The WMIQuery UDF is great when you need to get one or two WMI values, but is very inefficient when you need to gather a dozen or more. The UDF instantiates a new WMI connection with each call, which can take a second or more per call. Take a look at WMISysQuery(), which makes a single WMI instantiation and then fills an array with 40 of the most commonly needed system inventory values. Use that model to create a custom function if needed.

There's no need to comment-out a function (Memory). You can either simply delete it or ignore it - if you don't call it, it doesn't do anything.

I got rid of several duplicate references including "BREAK ON CLS", put the Break On at the top of the script, moved the comment describing the script into the header section.

To work with KGen, I'd suggest you install it on your workstation until you understand how it works. Create C:\DEV & C:\DEV\KixLib. Run the setup and specify C:\DEV\KixLib for the kixtart library path. You MUST run the install from a command prompt, and MUST close and re-open the command prompt for the utility to work as it changes the environment settings. These will only take effect when a new command window is opened.

Under D:\DEV, create a folder for your project (INVENTORY). Create Inventory.txt in that folder and copy the contents of the script below, from the beginning to the empty line after "Functions Follow" into it. Make sure you put any additional functions you downloaded from KORG (such as the CD Key UDF) into the KixLib folder. Then, simply run "KGEN INVENTORY" - it should generate the INVENTORY.KIX script with all needed UDFs, ready to run. Pay attention to the warnings it generates as it will identify undeclared variables, mismatched quotes and other paired objects, and similar code issues.

We offer free support for installation issues of KixDev and free and paid support for all our products through our web site. Feel free to contact us to work out your install/setup issues.
 Code:
; Hardware Inventory , OS Information & MS Key Inventory - Logon Script lists all Hardware & MS CD Keys per Client
; 
; Version 0.1 - Backfight - 09.12.2013
; UDF´s: UDF WMIQuery, UDF MEMORY, (DBLib.udf)
;
; Tasks:
; Identify Computer (@WKSTA)
;
; Query database
;  is this computer listed?
;    If so, was the last update more than 6 months ago?
;      If NOT, exit - nothing to do
;
; Need to perform an inventory
;
; Clear/Init the NEWDATA array
;
; Query for the following items and load the NEWDATA array with the results. 
; O/S Version
; Hardware Platform
; Installed Software  
;


; DESCRIPTION OF THE SCRIPT
;=======================================================================
; Collect all Hardware & OS Informationen from all WKST in the Domain to get a complete Inventory + all installed Microsoft Keys


Break On


; Declare variables
; ======================================================================

DIM $CNstring				; Database variables
DIM $CMDtxt					; 
DIM $cmd					; 
DIM $rs					; 
DIM $cn					;

DIM $ModifyDateTime			; Return ModifyDateTime 
DIM $computername				; Workstation Name
DIM $username				; Username
DIM $osname					; OS Name
DIM $ServicePack				; SP
DIM $InstallDate				; Install Date
DIM $LastBoottime				; Last Boottime
DIM $OSSerial				; OS SN
DIM $SysManufacturer			; System Manufacturer
DIM $SysModel				; System Model
DIM $SysSerial				; System SN
DIM $CPUDescription			; CPU Description
DIM $CPUSpeed				; CPU Speed
DIM $SysMemory				; System RAM
DIM $VideoCard				; Video Card Name
DIM $VideoRes				; Video Resulution
;DIM $NicCard				; Networkcard
;DIM $nic					; NIC Var.
DIM $CDKey					; CDKeys (OS Key, MS Office, etc)
DIM $Privilegien				; User Privilegien
DIM $IP					; IP Adress
DIM $MAC					; Mac Hardware Adress
DIM $Uhrzeit				; Time
DIM $MonitorDescription			; Monitor Description
DIM $MonHersteller			; Monitor Manufactor
DIM $OSType					; Get OSType
DIM $wmiColl
DIM $wmiObj
DIM $DBpath


Global $DEBUG				; Debug flag
Global $VERSION				; version string
;Global $MSG_LOG_, $ERR_LOG_		; log filenames - used by fMsg()


; Set program options
; ======================================================================
$ = SetOption('Explicit', 'On')
$ = SetOption('WrapAtEOL', 'On')
$ = SetOption('NoVarsInStrings', 'On')
$ = SetOption('NoMacrosInStrings', 'On')


; Define values
; ======================================================================
$DEBUG = 0
$VERSION = '1.0'

; CONFIGURE DATABASE PATH
; ======================================================================

$DBpath = "\\server\...\IT-Inventar.mdb"

CLS
AT (1,1) "Asset Audit Script Processing..."
SLEEP 2
CLS

; CONFIGURE DATABASE CONNECTION STRING
; ======================================================================

$CNstring="Driver={Microsoft Access Driver (*.mdb)}; DBQ=$DBpath"
$CMDtxt = "select * from COMPUTERS where computername = '@WKSTA'"
$cn = CreateObject ("ADODB.Connection")
$cmd = CreateObject ("ADODB.Command")
$rs = CreateObject ("ADODB.RecordSet")

$cn.connectionstring = $CNstring
$cn.Open
$cmd.activeconnection = $cn
$rs.cursortype = 3
$rs.locktype = 3
$rs.activecommand = $cmd

$cmd.commandtext = $CMDtxt $rs.Open ($cmd)


; MAIN Code
; ======================================================================



; COLLECT WORKSTAION ASSET INFORMATION
; ======================================================================
$MAC = @ADDRESS
$Uhrzeit = @time
$Privilegien = @PRIV
$IP = @IPADDRESS0
$ModifyDateTime = @DATE + " " + @TIME
$computername = @WKSTA
$username = @userid
$osname = WMIQuery("Caption","Win32_OperatingSystem")
$OSType = WMIQuery("BuildType","Win32_OperatingSystem")
$ServicePack = WMIQuery("CSDVersion","Win32_OperatingSystem")
$InstallDate = WMIQuery("InstallDate","Win32_OperatingSystem")
$LastBoottime = @date
$OSSerial = WMIQuery("SerialNumber","Win32_OperatingSystem")
$SysManufacturer = WMIQuery("Manufacturer","Win32_ComputerSystem")
$SysModel = WMIQuery("Model","Win32_ComputerSystem")
$SysSerial = WMIQuery("SerialNumber","Win32_BIOS")
$wmiColl = GetObject("WinMgmts:root/cimv2").ExecQuery("Select * FROM Win32_Processor ")
For Each $wmiObj in $wmiColl
  $CPUDescription = $wmiObj.Name	
Next

Sleep 5

$CPUSpeed = WMIQuery("CurrentClockSpeed","Win32_Processor")
;$SysMemory = val(WMIQuery("TotalPhysicalMemory","Win32_LogicalMemoryConfiguration"))/1024
;If $SysMemory = 0
;  $SysMemory = Memory()
;EndIf
$VideoCard = WMIQuery("Description","Win32_VideoController")
$VideoRes = WMIQuery("VideoModeDescription","Win32_VideoController")
;for each $nic in Split(WMIQuery("ProductName","Win32_NetworkAdapter"),"|")
;if instr($nic,"miniport")=0 and instr($nic,"RAS")=0 and instr($nic,"Parallel")=0
;$NicCard = $nic
$wmiColl = GetObject("WinMgmts:root/cimv2").ExecQuery("Select * FROM Win32_DesktopMonitor")

For Each $wmiObj in $wmiColl
  $MonitorDescription = $wmiObj.Name
  $MonHersteller = $wmiObj.MonitorManufacturer
Next


; Get CD Key
 Dim $RegArray, $RegView, $Value,$Product,$Key, $rc, $Array2,$guid
  $RegView=setoption("WOW64AlternateRegView","On")
  $RegArray = SearchReg("HKLM\Software\Microsoft","DigitalProductID",2)
  if @onwow64
    $Array2 = SearchReg("HKLM\Software\WOW6432NODE\Microsoft","DigitalProductID",2)
    $RegArray=ArrayAdd($RegArray,$Array2)
  endif
  If ubound($RegArray)<0
      ? 'No matching items found'
  Else
    For Each $Value In $RegArray
      If $Value
        $Product = ReadValue(Join(Split($value,'<=>DigitalProductId'),''),'ProductName')
        If $product=""
          $guid="{" + split(split($value,"{")[1],"}")[0] + "}"
          if instr($value,"WOW6432Node")
            $product=readvalue("HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" + $guid,"DisplayName")
          else
            $product=readvalue("HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\" + $guid,"DisplayName")
          endif
        endif
        If $Product
          $Key = Get_Product_Key(ReadValue(Join(Split($value,'<=>DigitalProductId'),''), 'DigitalProductID'))
		  $CDKey = $Product + ': ' + $Key
;            ? $Product + ': ' + $Key				; Wanna get this results in diferent Rows in the MDB Database
        EndIf
      EndIf
    Next
  EndIf
  $RegView=setoption("WOW64AlternateRegView",$RegView)



; ADD RECORDS TO THE DATABASE
; ======================================================================

If $rs.eof = -1 ; addnew is only needed if a record for this workstation was not found.
 $rs.addnew
EndIf

$rs.fields.item("MonHersteller").value = $MonHersteller
$rs.fields.item("MonitorDescription").value = $MonitorDescription
$rs.fields.item("IP").value = $IP
$rs.fields.item("Uhrzeit").value = $Uhrzeit
$rs.fields.item("MAC").value = $MAC
$rs.fields.item("PRIVILEGIEN").value = $Privilegien
$rs.fields.item("COMPUTERNAME").value = $computername
$rs.fields.item("OSNAME").value = $osname
$rs.fields.item("OSTYPE").value = $OSType
$rs.fields.item("SERVICEPACK").value = $ServicePack
$rs.fields.item("INSTALLDATE").value = $InstallDate
$rs.fields.item("LASTBOOTTIME").value = $LastBoottime
$rs.fields.item("OSSERIAL").value = $OSSerial
$rs.fields.item("SYSMANUFACTURER").value = $SysManufacturer
$rs.fields.item("SYSMODEL").value = $SysModel
$rs.fields.item("SYSSERIAL").value = $SysSerial
$rs.fields.item("CPUDESCRIPTION").value = $CPUDescription
$rs.fields.item("CPUSPEED").value = $CPUSpeed
;$rs.fields.item("SYSMEMORY").value = $SysMemory
$rs.fields.item("VIDEOCARD").value = $VideoCard
$rs.fields.item("VIDEORES").value = $VideoRes
;$rs.fields.item("NICCARD").value = $NicCard
$rs.fields.item("MODIFYDATETIME").value = $ModifyDateTime
$rs.fields.item("USERNAME").value = $Username
$rs.fields.item("CDKey").value = $CDKey
$rs.update

$rs.Close

Exit 0



; ======================================================================
; functions follow...
; ======================================================================



; UDF WMIQuery
; ======================================================================
;FUNCTION	WMIQuery
;
;ACTION		Queries WMI information from supported systems
;
;AUTHOR		Radimus
;
;CONTRIBUTORS	kdyer, Shawn, And Howard
;
;		gbarnas: altered EXECUTE function for NoVarsInStrings support
;                        Added support for pre-auth object
;			 
;
;VERSION	2.4.2
;
;DATE CREATED	12/22/2001
;
;DATE MODIFIED	04/02/2007 - GAB - added pre-authenticated object pointer support
;
;KIXTART	4.x
;
;SYNTAX		WMIQuery(what,from,[computer],[where],[where_arg],[objAuth])
;
;PARAMETERS	what
;            
;
;		from
;            	 - Win32 Collection
;
;		optional computer
;		 - defaults to local PC
;
;		optional where
;		 - addl parameter for a 'WHERE' clause. Used with $x
;
;		optional where_arg
;		 - addl parameter for a 'WHERE' clause. Used with $Where
;
;		optional objAuth
;		 - pre-authenticated token obtained from WMIAuthenticate
;
;RETURNS	Array 
;		@error 1 = Cannot create COM object on target PC
;
;REMARKS	9/2003 - This release alters the return from the function into an ARRAY, where previous versions
;		used a pipe '|' delimited string.  If you are updating to this version, check your code closely!
;		2/2004 - Added support for authentication
;
;DEPENDENCIES	kix 4.x+, WMI
;
;EXAMPLE	$make  = WMIQuery("Manufacturer","Win32_ComputerSystem")[0]
;		$modem = WMIQuery("Description","Win32_POTSModem",$remotePC,"Status","OK")[0]
;		for each $stick in WMIQuery("Capacity","Win32_PhysicalMemory")
;		  ? val($stick) / 1048576
;		next
;
;KIXTART BBS	http://www.kixtart.org/board/ultimatebb.php?ubb=get_topic;f=12;t=000117
;		http://download.microsoft.com/download/platformsdk/wmicore/1.5/W9XNT4/EN-US/wmicore.EXE 

Function WMIQuery($sWhat, $sFrom, Optional $sComputer, Optional $sWhere, Optional $x, Optional $root, Optional $pAuth)

  Dim $, $sQuery, $objEnum, $sValue, $Tmp, $SystemSet, $objInstance, $objLocator 

  $sComputer = Trim(Join(Split($sComputer,'\'),''))

  If Not $sComputer Or $sComputer = @WKSTA
    $sComputer = '.'
  EndIf

  If Not $root
    $root = '\root\cimv2'
  Endif

  $sQuery = 'Select ' + $sWhat + ' From '+ $sFrom

  If $sWhere And $x
    $sQuery = $sQuery + " Where " + $sWhere + " = '" + $x + "'"
  EndIf

  If $pAuth
    $SystemSet = $pAuth
  Else
    $SystemSet = GetObject('winmgmts:{impersonationLevel=impersonate}!\\' + $sComputer + $root)
    If @ERROR Or Not $SystemSet
      Exit Val('&' + Right(DecToHex(@ERROR), 4))
    EndIf
  EndIf

  $objEnum = $SystemSet.ExecQuery($sQuery)
  If @ERROR Or Not $objEnum
    Exit Val("&" + Right(DecToHex(@ERROR), 4))
  EndIf

  For Each $objInstance in $objEnum
    $ = Execute(Chr(36) + 'sValue = ' + Chr(36) + 'objInstance.' + $sWhat)
    If VarType($sValue) & 8192
      $Tmp = $Tmp +'|' + Join($sValue,'|')
    Else
      $Tmp = $Tmp +'|' + $sValue 
    EndIf
  Next

  $WMIQuery = split(substr($Tmp,2),'|')
  Exit Val("&" + Right(DecToHex(@ERROR), 4))

EndFunction


; GET MS CD KEYS
; UDF from Allen. To be found under this link: http://www.kixtart.org/forums/ubbthreads.php?ubb=showflat&Number=201729#Post201729
; ======================================================================

function Get_Product_Key($sproductid)
  Dim $aiKeyChars[24], $ilByte, $i, $iLOffset, $iUOffset, $bProductKey[15], $c, $nCur, $sCDKey
  For Each $c In Split("B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9")
    $aiKeyChars[$i]=Asc($c)
    $i=$i+1
  Next
  if len($sProductID)=2544
    $iLOffset=809
    $iUOffset=823
  else
    $iLOffset=53
    $iUOffset=67
  endif
  For $i = $iLOffset*2-1 To $iUOffset*2-1 Step 2
    $bProductKey[($i-($iLOffset*2-1))/2]=Execute("Exit &"+SubStr($sProductId,$i,2))
  Next
  For $ilByte = 24 To 0 Step -1
    $nCur = 0
    For $i=14 To 0 Step -1
      $nCur = $nCur * 256 ^ $bProductKey[$i] ; NOTE THE XOR! 
      $bProductKey[$i] = Int($nCur / 24)
      $nCur = $nCur Mod 24
    Next
    $sCDKey = Chr($aiKeyChars[$nCur]) + $sCDKey
    If $ilByte Mod 5 = 0 And $ilByte <> 0 $sCDKey = "-" + $sCDKey EndIf
  Next
  $Get_Product_Key=$sCDKey
EndFunction
 

Function SearchReg($Key,$Str,$SrcIn)
  Dim $Idx,$vName,$Value,$num,$SubKey,$fArr,$mbr
  $SearchReg = ''
  $num = 0
  $Idx = 0
  $vName = EnumValue($Key,$Idx)
  Do
    $mbr = ''
    If $SrcIn & 1
    $Value = ReadValue($Key,$vName)
     If InStr($Value,$Str)
       $mbr = $Key + "<=>" + IIf($vName,$vName,'<Default>')
     EndIf
    EndIf
    If ($SrcIn & 2) And InStr($vName,$Str)
      $mbr = $Key + "<=>" + $vName
    EndIf
    If $mbr
      ReDim Preserve $SearchReg[$num]
      $SearchReg[$num] = $mbr
      $num = $num + 1
    EndIf
    $Idx = $Idx + 1
    $vName = EnumValue($Key,$Idx)
  Until @Error
  $Idx = 0
  $SubKey = EnumKey($Key,$Idx)
  While $SubKey
    If ($SrcIn & 4) And InStr($SubKey,$Str)
      ReDim Preserve $SearchReg[$num]
      $SearchReg[$num] = $Key + '\' + $SubKey + "<=><KeyName>"
      $num = $num + 1
    EndIf
    $fArr = SearchReg($Key + "\" + $SubKey,$Str,$SrcIn)
    If @Error = 0
      For Each $mbr In $fArr
        ReDim Preserve $SearchReg[$num]
        $SearchReg[$num] = $mbr
        $num = $num + 1
      Next
    EndIf
    $Idx = $Idx + 1
    $SubKey = EnumKey($Key,$Idx)
  Loop

  Exit VarType($SearchReg) = 8
EndFunction
 

Function ArrayAdd($Array1, $Array2)
 ;Returns a new $Array1 
 Dim $n,$i
 $n = UBound($Array1) + 1
 REDIM PRESERVE $Array1[$n+UBound($Array2)]
 For $i = 0 to UBound($Array2)
   $Array1[$n+$i] = $Array2[$i]
 Next
 $ArrayAdd = $Array1
EndFunction


; UDF MEMORY
; ======================================================================
;;FUNCTION		Memory() 
;; 
;;AUTHOR		Glenn Barnas
;; 
;;ACTION		Returns the amount of Available Physical RAM in a local or remote system 
;; 
;;SYNTAX		Memory([system]) 
;; 
;;VERSION		4.0 
;; 
;;DATE			v1.0 - 2004/02/04
;; 
;;DATE REVISED		v2.0 - 2005/02/25 - updated to allow larger memory sizes (x86)
;;			v3.0 - 2007/10/05 - rewrite to support x64 systems, tighten code
;;			v4.0 - 2013/11/02 - rewrite to detect large memory blocks on post-Vista platforms
;; 
;;PARAMETERS		System - OPTIONAL - name of system to query. Default is local system
;;
;;REMARKS		Returns Physical RAM size available to the O/S using registry memory allocation map
;;			Returns @ERROR on registry read failure, or 13 / "Data is Invalid" if reg is empty
;;			DOES NOT return physical hardware ram value! Some systems allocate RAM to BIOS cache 
;;			or video adapters and this memory is not reported. This can be adjusted for using
;;			the second example below.
;; 
;;RETURNS		Integer - Available Physical RAM (in Megabytes) 
;; 
;;DEPENDENCIES		None 
;; 
;;TESTED WITH		WinXP, Vista, Win7, Win8
;;			Windows Server 2000, 2003, 2008, 2012
;;			Tested with up to 16G of RAM 
;; 
;;EXAMPLES		$RAM = Memory('ThatPC')		; Get the available RAM from a remote computer
;;			
;;			; Adjust for BIOS/Video ram to estimate total physical RAM by using the smallest
;;			; deployed DIMM module as an increment. Use "1024" for full GB increments.
;;			; If the GB flag is used, this method must be adjusted to define MSize in GB values
;;			; (e.g. 0.5 instead of 512). 
;;			$MSize = 512			; Size of smallest RAM module (DIMM)
;;			
;;			$Mem = Memory()			; get reported memory
;;			$Ma  = $Mem / $MSize		; determine number of modules installed
;;			
;;			; If a fractional module is detected, add another full module
;;			; this accounts for a fractional module used for BIOS cache or video RAM
;;			If $Mem Mod $MSize $Ma = $Ma + 1 EndIf
;;			
;;			; $Mem now holds a value based more closely on installer rather than available RAM
;;			$Mem = $Ma * $MSize		; Memory is #_modules * Mod_Size
;;			
;; 
;
;Function Memory(Optional $_System, Optional $_fGB)
;
;  Dim $_MemMap				; Physical Memory Map
;  Dim $_Start, $_End, $_Step		; for/next start & step increment
;  Dim $_Sum				; running sum of memory from map
;  Dim $_Idx				; temporary index var
;  Dim $_iMem				; Memory region size index
;  Dim $_Error				; Error placeholder
;
;  ; Insure $_System has "\\System\" format if it is specified 
;  If $_System <> ''
;    $_System = '\\' + Join(Split($_System, '\'), '', 3) + '\'
;  EndIf

;  ; Get the memory value from the registry 
;  $_Idx = $_System + 'HKLM\hardware\resourcemap\system resources\physical memory'
;  $_MemMap = ReadValue($_Idx, '.Translated')

;  ; Check for invalid read and Return 
;  If Len($_MemMap) = 0 Or @ERROR
;    $Memory = 0				; return 0 Mbytes 
;    $_Error = IIf(@ERROR, @ERROR, 13) 	; Return "Data is Invalid" if no error but data is blank 
;    Exit $_Error
;  EndIf

;  ; determine system's O/S type based on architecture
;  $_Idx = $_System + 'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
;  If ReadValue($_Idx, 'PROCESSOR_ARCHITECTURE') = 'AMD64'
;    $_Step  = 40	; Define the step size based on the O/S Architecture
;    $_Start = 33	; Offset where memory descriptor blocks start
;    $_Sum   = 0.0	; no unreported base memory to account for
;    $_iMem  = 10	; Memory size index
;  Else
;    $_Step  = 32	; Define the step size based on the O/S Architecture
;    $_Start = 41	; Offset where memory descriptor blocks start
;    $_Sum   = 737280.0	; account for base memory not identified in memory map - x86 only
;    $_iMem  = 2		; Memory size index
;  EndIf
;  $_End = Len($_MemMap) - 8

;  For $_Idx = $_Start to $_End Step $_Step
;    $_Block = SubStr($_MemMap, $_Idx, $_Step)

;    If SubStr($_Block, $_iMem, 1) > 3
;      $_Sum = $_Sum + CDbl(Val('&' + SubStr($_Block, $_Step - 1, 2))) * 4294967296.0
;                    + CDbl(Val('&' + SubStr($_Block, $_Step - 3, 2))) * 16777216.0
;                    + CDbl(Val('&' + SubStr($_Block, $_Step - 5, 2))) * 65536.0
;                    + CDbl(Val('&' + SubStr($_Block, $_Step - 7, 2))) * 256.0
;                    + CDbl(Val('&' + SubStr($_Block, $_Step - 9, 2)))
;    Else
;      $_Sum = $_Sum + CDbl(Val('&' + SubStr($_Block, $_Step - 1, 2))) * 16777216.0
;                    + CDbl(Val('&' + SubStr($_Block, $_Step - 3, 2))) * 65536.0
;                    + CDbl(Val('&' + SubStr($_Block, $_Step - 5, 2))) * 256.0
;                    + CDbl(Val('&' + SubStr($_Block, $_Step - 7, 2)))
;    EndIf
;  Next

;  ; Sum is in Bytes - return the total as megabytes
;  $Memory = CInt($_Sum / 1048576)
;  Exit 0

;EndFunction
_________________________
Actually I am a Rocket Scientist! \:D