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 ?
Who is Participating?
DatabaseMX (Joe Anderson - Microsoft Access MVP)Connect With a Mentor Database ArchitectCommented:
puppydogbuddyConnect With a Mentor Commented:
see also this link:

<o/t>Hi Mx!
Gustav BrockConnect With a Mentor CIOCommented:
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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

DatabaseMX (Joe Anderson - Microsoft Access MVP)Database ArchitectCommented:
</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!

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.