Updating the registry for OpenVPN

Windows specific forum
User avatar
RichAlgeni
Addict
Addict
Posts: 914
Joined: Wed Sep 22, 2010 1:50 am
Location: Bradenton, FL

Updating the registry for OpenVPN

Post by RichAlgeni »

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