Go Premium for a chance to win a PS4. Enter to Win


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

Posted on 2013-11-17
Medium Priority
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
  • 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)
NEW Veeam Backup for Microsoft Office 365 1.5

With Office 365, it’s your data and your responsibility to protect it. NEW Veeam Backup for Microsoft Office 365 eliminates the risk of losing access to your Office 365 data.


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 1000 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 35

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 35

Accepted Solution

sarabande earned 1000 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

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Question has a verified solution.

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

For those of you who don't follow the news, or just happen to live under rocks, Microsoft Research released a beta SDK (http://www.microsoft.com/en-us/download/details.aspx?id=27876) for the Xbox 360 Kinect. If you don't know what a Kinect is (http:…
A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
Video by: ITPro.TV
In this episode Don builds upon the troubleshooting techniques by demonstrating how to properly monitor a vSphere deployment to detect problems before they occur. He begins the show using tools found within the vSphere suite as ends the show demonst…
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper corn…

886 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