Registry-Keys in VBA auf Windows 7 auslesen

Mittwoch, 27.5.2015, 09:18 > daMax

Seufz. :( Mit Windows 7 gibt es auf 64-bittigen Maschinen echte Probleme wenn man versucht, Registry-Keys per VBA auszulesen.

Dieses VB-Script:

Dim objWShell
Dim RegPath: RegPath = "HKEY_LOCAL_MACHINE\SOFTWARE\pfad\zum\regkey"
Dim RegKey
Set objWShell = CreateObject("Wscript.shell")
RegKey = objWShell.RegRead(RegPath)
msgbox(regkey)

funktioniert blendend. Wenn man exakt diesen Code jedoch nach VBA stopft und rennen lässt, reagiert Windows 7 (64-bit) so:

invalid-root-in-registry-key

Hat was mit 64-Bit Architektur und hastennichgesehn zu tun. Ein erster sehr cleverer Ansatz funktioniert nicht die Bohne, weil er, statt den tatsächlichen RegKey auszulesen, einen neuen unter HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\pfad\zum erzeugt und dort einen Schlüssel namens regkey anlegt. Meh.

Die Lösung lautet wie folgt:

' Reads a REG_SZ value from the local computer's registry using WMI.
' Parameters:
' RootKey - The registry hive as String
' Key - The key that contains the desired value.
' Value - The value that you want to get.
' RegType - The registry bitness: 32 or 64.
'
Function ReadRegStr(RootKey As String, Key, Value, RegType)

TheKey = -99
Select Case UCase(RootKey)
Case "HKEY_CLASSES_ROOT": TheKey = &H80000000
Case "HKEY_CURRENT_USER": TheKey = &H80000001
Case "HKEY_LOCAL_MACHINE": TheKey = &H80000002
Case "HKEY_USERS": TheKey = &H80000003
Case "HKEY_CURRENT_CONFIG": TheKey = &H80000004
Case "HKEY_DYN_DATA": TheKey = &H80000005
End Select

If TheKey = -99 Then
Exit Function
End If

Dim oCtx, oLocator, oReg, oInParams, oOutParams

Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
oCtx.Add "__ProviderArchitecture", RegType

Set oLocator = CreateObject("Wbemscripting.SWbemLocator")
Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv")

Set oInParams = oReg.Methods_("GetStringValue").InParameters
oInParams.hDefKey = TheKey
oInParams.sSubKeyName = Key
oInParams.sValueName = Value

Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx)

ReadRegStr = oOutParams.sValue
End Function

und wird auf einem 64-bittigen Windows7 so verwendet:

RegKey = ReadRegStr("HKEY_LOCAL_MACHINE", "SOFTWARE\pfad\zum", "regkey", 64)

Danke, stackoverflow!