[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2601
  • Last Modified:

How to read a registry key in VBA

I would like to populate me.HDSerial with the data from: HKLM\Software\Microsoft\Windows Genuine Advantage\HDSLN

How can I read this registry data value ?
3 Solutions
DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
see also this link:

<o/t>Hi Mx!
Gustav BrockCIOCommented:
Here's a function:

Public Function GetHDSLN() As String

  Dim hKeyVar   As Long
  Dim PathVar   As String
  Dim ValueVar  As String
  Dim DataVar   As String
  PathVar = "Software\Microsoft\Windows Genuine Advantage"
  ValueVar = "HDSLN"
  Call ReadRegistry(hKeyVar, PathVar, ValueVar, DataVar)
  GetHDSLN = DataVar

End Function

On my machine it returns "5RA1GZF0".

Insert the function and the generic code below into a new module.

Option Compare Database
Option Explicit
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const KEY_READ = &H20019
Private Const REG_SZ = 1
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
  Alias "RegOpenKeyExA" ( _
  ByVal hKey As Long, _
  ByVal lpSubKey As String, _
  ByVal ulOptions As Long, _
  ByVal samDesired As Long, _
  phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
  Alias "RegQueryValueExA" ( _
  ByVal hKey As Long, _
  ByVal lpValueName As String, _
  ByVal lpReserved As Long, _
  ByRef lpType As Long, _
  ByRef lpData As Any, _
  ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
  ByVal hKey As Long) As Long
Private Sub ReadRegistry( _
  hKey As Long, _
  subkey As String, _
  ValueVar As String, _
  DataVar As String)
  Dim datatype As Long  ' receives data type of read value
  Dim DataLen As Long  ' receives length of returned data
  Dim retval As Long  ' return value
  ' hKey: receives a handle to the newly created or opened registry key
  ' subkey: name of the subkey to open
  ' DataVar: receives data read from the registry
  ' datatype: receives data type of read value
  ' DataLen: receives length of returned data
  ' retval: return value
  ' Open the registry key.
  retval = RegOpenKeyEx(hKey, subkey, 0, KEY_READ, hKey)
  If retval = 0 Then
    ' Create buffer to receive the incoming data.
    DataLen = 255
    DataVar = Space(DataLen)
    ' Read the value from the registry key.
    retval = RegQueryValueEx(hKey, ValueVar, 0, datatype, ByVal DataVar, DataLen)
    ' Only attempt to display the data if it is in fact a string.
    If datatype = REG_SZ Then
      ' Remove zero termination and empty space from the buffer.
      DataVar = Left(DataVar, DataLen - 1)
    End If
  End If
  ' Close the registry key.
  retval = RegCloseKey(hKey)
End Sub

Open in new window

NEW Veeam Agent for Microsoft Windows

Backup and recover physical and cloud-based servers and workstations, as well as endpoint devices that belong to remote users. Avoid downtime and data loss quickly and easily for Windows-based physical or public cloud-based workloads!

DatabaseMX (Joe Anderson - Microsoft MVP, Access and Data Platform)Commented:
</ot Hey pDog>

Gustav BrockCIOCommented:
Could you explain what this value is for?
Other unknown info is available as well:


detroitdrAuthor Commented:
Cactus, this is the REAL serial number of your hd. The only problem using this is WGA must have run at least once to have this key.
the UDG is unique number for your computer. again.. WGA must run once to have this.

Gustav BrockCIOCommented:
OK, thanks!


Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now