使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

 

我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的项去了。但是做过安装程序开发人员可能遇到过“需要去掉重定向”的问题,即直接访问64位程序的注册表。

网上有很多winAPI的方法,关闭注册表的重定向稍微复杂。(关闭文件系统的重定向稍微简单些,搬过来就可以用;关闭注册表的重定向我现在没看懂。)

我这里提供的方法不需要关闭重定向,也不需要用winAPI,操作起来方便了许多。具体如下:

    第一个方法是获得根节点的句柄,常数是固定的。

 

     static IntPtr GetHiveHandle(RegistryHive hive)
        {
            IntPtr preexistingHandle = IntPtr.Zero;

            IntPtr HKEY_CLASSES_ROOT = new IntPtr(-2147483648);
            IntPtr HKEY_CURRENT_USER = new IntPtr(-2147483647);
            IntPtr HKEY_LOCAL_MACHINE = new IntPtr(-2147483646);
            IntPtr HKEY_USERS = new IntPtr(-2147483645);
            IntPtr HKEY_PERFORMANCE_DATA = new IntPtr(-2147483644);
            IntPtr HKEY_CURRENT_CONFIG = new IntPtr(-2147483643);
            IntPtr HKEY_DYN_DATA = new IntPtr(-2147483642);
            switch (hive)
            {
                case RegistryHive.ClassesRoot: preexistingHandle = HKEY_CLASSES_ROOT; break;
                case RegistryHive.CurrentUser: preexistingHandle = HKEY_CURRENT_USER; break;
                case RegistryHive.LocalMachine: preexistingHandle = HKEY_LOCAL_MACHINE; break;
                case RegistryHive.Users: preexistingHandle = HKEY_USERS; break;
                case RegistryHive.PerformanceData: preexistingHandle = HKEY_PERFORMANCE_DATA; break;
                case RegistryHive.CurrentConfig: preexistingHandle = HKEY_CURRENT_CONFIG; break;
                case RegistryHive.DynData: preexistingHandle = HKEY_DYN_DATA; break;
            }
            return preexistingHandle;
        }

        /// <summary>
        /// 用于32位程序访问64位注册表
        /// </summary>
        /// <param name="hive">根级别的名称</param>
        /// <param name="keyName">不包括根级别的名称</param>
        /// <param name="valueName">项名称</param>
        /// <param name="view">注册表视图</param>
        /// <returns>值</returns>
        static object GetValueWithRegView(RegistryHive hive, string keyName, string valueName, RegistryView view)
        {

            SafeRegistryHandle handle = new SafeRegistryHandle(GetHiveHandle(hive), true);//获得根节点的安全句柄

            RegistryKey subkey = RegistryKey.FromHandle(handle, view).OpenSubKey(keyName);//获得要访问的键

            RegistryKey key = RegistryKey.FromHandle(subkey.Handle, view);//根据键的句柄和视图获得要访问的键

            return key.GetValue(valueName);//获得键下指定项的值
        }
        /// <summary>
        /// 用于32位的程序设置64位的注册表
        /// </summary>
        /// <param name="hive">根级别的名称</param>
        /// <param name="keyName">不包括根级别的名称</param>
        /// <param name="valueName">项名称</param>
        /// <param name="value">值</param>
        /// <param name="kind">值类型</param>
        /// <param name="view">注册表视图</param>
        static void SetValueWithRegView(RegistryHive hive, string keyName, string valueName, object value, RegistryValueKind kind, RegistryView view)
        {
            SafeRegistryHandle handle = new SafeRegistryHandle(GetHiveHandle(hive), true);

            RegistryKey subkey = RegistryKey.FromHandle(handle, view).OpenSubKey(keyName, true);//需要写的权限,这里的true是关键。0227更新

            RegistryKey key = RegistryKey.FromHandle(subkey.Handle, view);

            key.SetValue(valueName, value, kind);
        }

       使用这些方法需要引入Microsoft.Win32.SafeHandles;Microsoft.Win32;system;这三个命名空间。方法只提供了主干,没有异常处理。望大家及时交流实际使用情况,不足之处请及时指出。

关于winAPI的方法可以访问http://home.cnblogs.com/u/xuguilin/相应的文章,同时也感谢xuguilin对我的指导。据介绍dotNet框架可能需要4.0版本以上

时间: 2024-09-08 19:44:34

使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表的相关文章

C# 32位程序访问64位系统注册表

原文:C# 32位程序访问64位系统注册表 我的上一篇文章已经阐述了"32位程序和64位程序在64位平台上读\写注册表的区别",那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注册表(即:64位程序所访问的注册表位置). 我们已经知道: ①:本机模式 64 位程序运行在纯模式下,并且访问键和存储在以下注册表子键中的值:HKEY_LOCAL_MACHINE\Software ②:32 位程序运行在 WOW64 模式下,并且访问键和值存储在以下注册表子项中:HKEY_

win7系统禁止远程更改注册表的方法

  win7系统禁止远程更改注册表的方法.本文教程分享win7系统禁止远程更改注册表的方法,win7系统的远程桌面功能相信大家都知道吧,默认情况下开启远程用户可以修改本地电脑的注册表功能,可以让我们在电脑有故障或者要取得文件的时候只要通过win7远程桌面就可以进行控制操作.不少用户觉得远程更改注册表对系统不安全,那么win7系统如何禁止远程更改注册表?下面大家一起看看win7系统禁止远程更改注册表的方法. 具体方法如下: 1.点"开始--运行"框,键入"Gpedit.msc&

解决运行asp文件时遇到的“常见错误 不能打开注册表关键字”问题

错误|关键字|解决|问题|注册表 相信大家在运行和数据库打交道的asp文件时遇到过一下的问题:Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005' [Microsoft][ODBC Microsoft Access Driver]常见错误 不能打开注册表关键字 'Temporary (volatile) Jet DSN for process 0x1844 Thread 0x1b40 DBC 0x554cc59c Jet'. /frie

windows系统(XP与win7)注册表编辑器打开方法

我们其实注册表编辑器会经常用到,通过修改注册表还可以设置软件参数等,解决一般电脑软件所无法解决的设置问题.那么注册表编辑器怎么打开呢?很多新手朋友都还不知道,下面三联教程介绍在xp系统和win7系统下注册表编辑器打开的方法. XP系统下打开注册表编辑器方法: 方法一:在我的电脑桌面 开始 - 运行 在运行框里输入 regedit 按确定(回车)即可进入注册表, 方法二:找到注册表运行文件 一般在windows xp系统中注册表程序文件都是在系统C盘里的Windows目录下,找到文件名为reged

请教:在64位操作系统中64位进程如何枚举32位进程中加载的模块?

问题描述 如题:操作系统为Windows7x64,主进程为x64,目标进程为x86:由于Win64系统会模拟x86的环境来运行x86的程序,使用的组件为Wow64xxx.dll等:所以在使用如下代码进行枚举得到的只有Wow64xxx.dll等,得不到真正加载的组件:代码:Processproc=Process.GetProcessById(targetProcessId);for(inti=0;i<proc.Modules.Count;i++){//此处在x64环境中无法获得x86进程中的组件C

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法

  错误信息:未在本地计算机上注册"microsoft.ACE.oledb.12.0"提供程序. 解决办法: 去http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe下载.然后安装就行了. 本错误是由于你使用了ACCESS2007版本建立的数据库,但服务器中没有相配合使用的程序,所以出错. 未在本地计算机上注册"micr

注册表编辑器被禁用的解决方法

 1.开始菜单_运行--输入regedit--确定. 2.开始---运行---输入Gpedit.msc --回车--用户配置--管理模版--系统--双击右侧窗口中的"阻止访问注册表编辑工具",在弹出的窗口中选择"已禁用"-确定. 3.使用工具软件 如优化大师.超级兔子等,都有个注册表锁定与解锁的设置,对于已经安装了这些软件的用户,这的方法是比较方便的. 打开超级兔子,进入"超级兔子魔法设置"--"系统"--去掉"禁止

WinXP系统注册表被禁用的6种解决方法

  今天,我们将要跟大家分享的是,WinXP系统注册表被禁用的6种解决方法.那么,可能会有电脑用户会问:WinXP系统的注册表被禁用了会造成什么后果,严重吗?我们知道注册表是Windows系统里的重要区域,很容易遭受到各种病毒,恶意网站的攻击,让你的注册表被禁用,当你的WinXP注册表被禁用后,你的系统也就变得薄弱,此时相当的危险,因此尽快解禁还需要使用一些手段.下面就告诉大家几招解禁WinXP注册表的方法. 注册表 1.使用工具软件(适用于WinXP及以上系统) 如优化大师.超级兔子等,都有个

XP系统开机提示注册表空间不足的解决方法

  今天小编在打开电脑的时候,突然跳出个"注册表空间不足"的提示,只有在关闭此窗口的情况下,才能正常的运行电脑.打开之后电脑的使用和往常没有什么区别,但是每次运行电脑的时候都会先跳出这样的提示,虽然没有什么影响,但是总觉得哪里出了什么问题,而且老是跳出这样的提示也很烦人,下面小编就来教大家如何彻底关闭"注册表空间不足"的提示. XP注册表空间不足解决的方法 具体的操作方法如下: 1.首先我们点击自己电脑的开始菜单,点击左下角的图标,弹出栏目我们找到里面的运行选项,点