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)
Forrester Webinar: xMatters Delivers 261% ROI

Guest speaker Dean Davison, Forrester Principal Consultant, explains how a Fortune 500 communication company using xMatters found these results: Achieved a 261% ROI, Experienced $753,280 in net present value benefits over 3 years and Reduced MTTR by 91% for tier 1 incidents.


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

Resolve Critical IT Incidents Fast

If your data, services or processes become compromised, your organization can suffer damage in just minutes and how fast you communicate during a major IT incident is everything. Learn how to immediately identify incidents & best practices to resolve them quickly and effectively.

Question has a verified solution.

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

In my previous article ( we saw the basics of serialization and how types/objects can be serialized to Binary format. In this blog we wi…
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an antispam), the admini…
Are you ready to implement Active Directory best practices without reading 300+ pages? You're in luck. In this webinar hosted by Skyport Systems, you gain insight into Microsoft's latest comprehensive guide, with tips on the best and easiest way…

756 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