Updating the registry for OpenVPN
Posted: Mon Feb 20, 2023 1:04 am
I was recently tasked with creating an OpenVPN installer, that not only installed the OpenVPN software, but also the client specific configuration files. The directions from the OpenVPN Server, in this case, Netgear said you would need to open Network and Sharing, click on Change adapter settings, and rename the TAP-Windows Adapter V9. I wondered if I could automate this. I could. Here is the code to modify the registry:
Code: Select all
; =======================================================================================
; Update the Registry
; =======================================================================================
Procedure UpdateRegistry()
Protected iIndex.i
Protected lpData.s
Protected lpType.i
Protected result.i
Protected lpcbData.i
Protected keyValue.s
Protected dispString.s
Protected networkKey.s
Protected classNumber.s
Protected lpValueName.s
Protected registryKey.i
Protected NetCfgInstanceId.s
Protected lpcchValueName.i = 1024
Protected keyValueNeeded.s = "TAP-Windows Adapter V9"
Protected netgearVPN.s = "NETGEAR-VPN"
Protected registryLevel.s = "SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}"
; loop through the potential number of entries for the network devices
For iIndex=0 To 999
classNumber = RSet(Str(iIndex), 4, "0")
networkKey = registryLevel + "\" + classNumber
result = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, networkKey, 0, #KEY_READ, @registryKey)
If result = #ERROR_SUCCESS
dispString = "Opened registry entry HKLM\" + networkKey
WriteToLog(@dispString)
lpData = Space(lpcchValueName)
lpValueName = "DriverDesc"
lpcbData = 1024
result = RegQueryValueEx_(registryKey, lpValueName, 0, @lpType, @lpData, @lpcbData)
If result = #ERROR_SUCCESS
keyValue = Trim(lpData)
If keyValue = keyValueNeeded
lpData = Space(lpcchValueName)
lpValueName = "NetCfgInstanceId"
lpcbData = 1024
result = RegQueryValueEx_(registryKey, lpValueName, 0, @lpType, @lpData, @lpcbData)
If result = #ERROR_SUCCESS
NetCfgInstanceId = Trim(lpData)
dispString = "NetCfgInstanceId = " + NetCfgInstanceId
WriteToLog(@dispString)
iIndex = 999
Else
dispString = "Error reading " + lpValueName
WriteToLog(@dispString)
EndIf
EndIf
Else
dispString = "Key " + lpValueName + " does not exit"
WriteToLog(@dispString)
ProcedureReturn #False
EndIf
Else
dispString = "Unable to open registry entry HKLM\" + networkKey
WriteToLog(@dispString)
ProcedureReturn #False
EndIf
; close the open key after each iteration
RegCloseKey_(registryKey)
Next
; now check the network config instance key for 'NETGEAR-VPN'
If NetCfgInstanceId > ""
registryLevel = "SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}"
networkKey = registryLevel + "\" + NetCfgInstanceId + "\Connection"
result = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, networkKey, 0, #KEY_ALL_ACCESS, @registryKey)
If result = #ERROR_SUCCESS
; now see if we need to update the 'Name' value
lpData = Space(lpcchValueName)
lpValueName = "Name"
lpcbData = 1024
result = RegQueryValueEx_(registryKey, lpValueName, 0, @lpType, @lpData, @lpcbData)
If result = #ERROR_SUCCESS
keyValue = Trim(lpData)
If keyValue = netgearVPN; 'NETGEAR-VPN' set above
dispString = "The registry entry 'Name' in HKLM\" + networkKey + " is already to " + netgearVPN + ", no modification required"
WriteToLog(@dispString)
Else
result = RegSetValueEx_(registryKey, lpValueName, 0, #REG_SZ, netgearVPN, StringByteLength(netgearVPN) + SizeOf(Character))
If result = #ERROR_SUCCESS
dispString = "Modified the registry entry 'Name' in HKLM\" + networkKey + " to " + netgearVPN
WriteToLog(@dispString)
Else
dispString = "Unable to modify the registy entry 'Name' in HKLM\" + networkKey
WriteToLog(@dispString)
ProcedureReturn #False
EndIf
EndIf
RegCloseKey_(registryKey)
Else
RegCloseKey_(registryKey)
dispString = "Unable to find 'Name' in HKLM\" + networkKey
WriteToLog(@dispString)
ProcedureReturn #False
EndIf
Else
dispString = "Unable to open HKLM\" + networkKey
WriteToLog(@dispString)
ProcedureReturn #False
EndIf
Else
dispString = "Unable to find " + keyValueNeeded + " in registry entry HKLM\" + registryLevel + networkKey
WriteToLog(@dispString)
ProcedureReturn #False
EndIf
dispString = "Updated the registry successfully."
WriteToLog(@dispString)
ProcedureReturn #True
EndProcedure