Reading and Writing Registry Key in 64 bit or 32 bit OS to force webbrowser control to IE9

Posted on 2013-11-17
Last Modified: 2013-11-19

Google maps recently forced the site to use greater than IE7 standards making the webbrowser control (WB) not work with their website.  The best solution seems to be modifying the registry to force the WB to use IE9 or 10 standards.  I'm trying to modify my code so that the user machine on all profiles will use the IE 9 standard.  I'd like to check if the following registry value is present and add it if it isn't in both 32 bit and 64 bit systems.  I'm having trouble however and the junk code is my attempts so far.

Value to be added to wow64 OR 32 bit registry:

32 bit:


Value Key: yourapplication.exe
Type: Reg_DWORD
Value: 9999 (decimal)

64 bit:


Value Key: yourapplication.exe
Type: Reg_DWORD
Value: 9999 (decimal)

as suggested by this nice person:

Thanks for any help you can give


            Dim RK As RegistryKey = RegistryKey.openbasekey(RegistryHive.LocalMachine, registryview.registry64)

            Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", True)
            Dim val As String()
            val = key.GetValueNames()
            key.SetValue("MYPROGRAM.EXE", "9999", RegistryValueKind.[String])

            '  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

            ' [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]"YOURPROGRAM.EXE"=dword:00002328
            'If Microsoft.Win32.Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION") Is Nothing Then
            '    ' Key doesn't exist
            '    MsgBox("Key doesn't exist")
            '    Microsoft.Win32.Registry.LocalMachine.CreateSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION")
            '    Microsoft.Win32.Registry.LocalMachine.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", "9999")
            '    ' Key existed
            'End If
        Catch ex As Exception

        End Try

Open in new window

Question by:zipnotic
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 2
  • 2

Author Comment

ID: 39656347
Still trying to figure this out.  Any help would be appreciated.  

If it means anything, VS 2010 is set to compile to x86.  It doesn't give me any other option.

Also tried the simpler

            '  My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", "TestValue", "This is a test value.")

but it resulted in a null object exception

Having a bit more success with:

            Registry.LocalMachine.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", "TestValue", RegistryValueKind.String)

 ' RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.WriteKey)

But that gives me permission denied exception (that's the closest I came so far to adding the key I need to).

The following only gives me "nothing" in the instances....


            Dim instance As RegistryKey = Registry.CurrentUser.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.WriteKey)
            Dim instance2 As RegistryKey = Registry.CurrentUser.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.WriteKey)
            Dim instance3 As RegistryKey = Registry.LocalMachine.CreateSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree)
            Dim name As String
            Dim value As Object
            Dim valueKind As RegistryValueKind

            name = "NEW TEST SUBKEY.EXE"
            value = "9999"
            valueKind = RegistryValueKind.DWord

            instance.SetValue(name, value, valueKind)

Open in new window


Author Comment

ID: 39656562
I'm reading about permissions in Windows 7, is that the problem when writing to Local Machine?  Something about adding something to the manifest?
LVL 96

Expert Comment

by:Bob Learned
ID: 39656602
Yes, Windows 7 security limits access by default, unless you elevate privileges to administrator level.

Create and Embed an Application Manifest (UAC)
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!


Author Comment

ID: 39656622
Looks like I have some reading to do.

Can you advise the best practice code (even just aircode) to ultimately write the following to the registry when the target machine may be

32 or 64
Win 7 or Win XP or Win 8
Users have no admin rights

         Internet Explorer
                     MYAPPLICATIONNAME.exe = (DWORD) 00009000
LVL 96

Assisted Solution

by:Bob Learned
Bob Learned earned 250 total points
ID: 39657208
If the user doesn't have admin rights, then you can impersonate an admin user.

WindowsIdentity.Impersonate Method

' This sample demonstrates the use of the WindowsIdentity class to impersonate a user. 
' This sample requests the user to enter a password on the console screen. 
' Because the console window does not support methods allowing the password to be masked, 
' it will be visible to anyone viewing the screen. 
' On Windows Vista and later this sample must be run as an administrator.  

Imports System
Imports System.Runtime.InteropServices
Imports System.Security.Principal
Imports System.Security.Permissions
Imports Microsoft.VisualBasic
Imports Microsoft.Win32.SafeHandles
Imports System.Runtime.ConstrainedExecution
Imports System.Security

Module Module1

    Public Class ImpersonationDemo

        'Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _ 
        '    ByVal lpszDomain As [String], ByVal lpszPassword As [String], _ 
        '    ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _ 
        '    ByRef phToken As IntPtr) As Boolean 

        Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _
            ByVal lpszDomain As [String], ByVal lpszPassword As [String], _
            ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _
            <Out()> ByRef phToken As SafeTokenHandle) As Boolean 

        Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Boolean 

        ' Test harness. 
        ' If you incorporate this code into a DLL, be sure to demand FullTrust.
        <PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
        Public Overloads Shared Sub Main(ByVal args() As String)
            Dim safeTokenHandle As SafeTokenHandle = Nothing 
            Dim tokenHandle As New IntPtr(0)

                Dim userName, domainName As String 

                ' Get the user token for the specified user, domain, and password using the  
                ' unmanaged LogonUser method.   
                ' The local machine name can be used for the domain name to impersonate a user on this machine.
                Console.Write("Enter the name of a domain on which to log on: ")
                domainName = Console.ReadLine()

                Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName)
                userName = Console.ReadLine()

                Console.Write("Enter the password for {0}: ", userName)

                Const LOGON32_PROVIDER_DEFAULT As Integer = 0
                'This parameter causes LogonUser to create a primary token. 
                Const LOGON32_LOGON_INTERACTIVE As Integer = 2

                ' Call LogonUser to obtain a handle to an access token. 
                Dim returnValue As Boolean = LogonUser(userName, domainName, Console.ReadLine(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, safeTokenHandle)

                Console.WriteLine("LogonUser called.")

                If False = returnValue Then 
                    Dim ret As Integer = Marshal.GetLastWin32Error()
                    Console.WriteLine("LogonUser failed with error code : {0}", ret)
                    Throw New System.ComponentModel.Win32Exception(ret)

                End If 
                Using safeTokenHandle
                    Dim success As String 
                    If returnValue Then success = "Yes" Else success = "No"
                    Console.WriteLine(("Did LogonUser succeed? " + success))
                    Console.WriteLine(("Value of Windows NT token: " + safeTokenHandle.DangerousGetHandle().ToString()))

                    ' Check the identity.
                    Console.WriteLine(("Before impersonation: " + WindowsIdentity.GetCurrent().Name))

                    ' Use the token handle returned by LogonUser. 
                    Using newId As New WindowsIdentity(safeTokenHandle.DangerousGetHandle())
                        Using impersonatedUser As WindowsImpersonationContext = newId.Impersonate()

                            ' Check the identity.
                            Console.WriteLine(("After impersonation: " + WindowsIdentity.GetCurrent().Name))

                            ' Free the tokens. 
                        End Using 
                    End Using 
                End Using 
            Catch ex As Exception
                Console.WriteLine(("Exception occurred. " + ex.Message))
            End Try 
        End Sub 'Main 
    End Class 'Class1
End Module 

Public NotInheritable Class SafeTokenHandle
    Inherits SafeHandleZeroOrMinusOneIsInvalid

    Private Sub New()

    End Sub 'New 

    Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _
            ByVal lpszDomain As [String], ByVal lpszPassword As [String], _
            ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _
            ByRef phToken As IntPtr) As Boolean
    <DllImport("kernel32.dll"), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SuppressUnmanagedCodeSecurity()> _
    Private Shared Function CloseHandle(ByVal handle As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean 

    End Function 
    Protected Overrides Function ReleaseHandle() As Boolean 
        Return CloseHandle(handle)

    End Function 'ReleaseHandle
End Class 'SafeTokenHandle

Open in new window

LVL 34

Expert Comment

ID: 39657248
to add to above comments:

if HKEY_CURRENT_USER would be an alternative, you should do it with that.

alternatively, you may think of a setup for your program that runs in admin mode and writes the entry to the registry.


Author Comment

ID: 39658061
So far, writing to the CURRENT_USER seems cleaner.  From what I understand the "registry director" will send the following entry to the right node automatically?  I tried it on a win 7 64 bit machine and an XP 32 bit machine and so far so good but will there be any deployment problems I should anticipate?  If not then this 'workaround' solution is a lot easier then I made it out to be...

The SetValue does nothing if the entry is already there, this is good.
The process is seamless to the user, this is good.
The webbrowser behaves, this is good.
The project is compiled for x86 while anyCPU breaks it, this is not so good, but tolerable.

            Dim instance3 As RegistryKey = Registry.CurrentUser.CreateSubKey("SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree)
            instance3.SetValue(Application.ExecutablePath.ToString(), 9999, RegistryValueKind.DWord)
            instance3.SetValue("IconicResolution.vshost.exe", 9999, RegistryValueKind.DWord) 'TODO Remove this line
Catch ex as exception
End Try
LVL 34

Accepted Solution

sarabande earned 250 total points
ID: 39659571
From what I understand the "registry director" will send the following entry to the right node automatically?

yes, the windows operation would translate the Registry.CurrentUser of your 32-bit program always to HKEY_CURRENT_USER of the 32-bit registry.

a 32-bit program cannot access the 64-bit and a 64-bit program would ignore the 32-bit part of registry.

so your programs would write and read to/from the right node.


Author Closing Comment

ID: 39659803
Thank you both.  Learned's would probably work but Sara's is quicker and direct.

Featured Post

PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…

631 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question