32位程序访问64位系统上的Windows注册表

今天在工作的过程中遇到个奇怪的为问题,就是通过c#获取注册表键值的问题,一般都比较简单:


 string SQLPath = string.Empty;

RegistryKey hkml = Registry.LocalMachine;
RegistryKey MSSQLServerKey = hkml.OpenSubKey(@"SOFTWARE\MICROSOFT\MSSQLServer");
if (MSSQLServerKey != null)
{
string[] keys = MSSQLServerKey.GetSubKeyNames();
RegistryKey setupKey = MSSQLServerKey.OpenSubKey("Setup");
if(setupKey!=null)
{
SQLPath = setupKey.GetValue("SQLPath").ToString();
}
}

但是我要取得值就是没有得到,debug,发现setupkey返回为null,打开本机的注册表是有的阿,奇了怪了……

这是怎么回事????  问了同事,他也觉得奇怪。 后来我发现是不是注册表位数问题啊,一下子找到为什么系统返回是缺少的那些键值。

发现Wow6432Node下面返回的就是我们在debug时候的返回值。

这下感觉找到了解决问题的方向了。就是要解决32位程序访问64位系统上的Windows注册表的问题。

最后在网上找到了两位高人的解法,我在这里都贴出来

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

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

最后我尝试使用了后一种方法,解决了这个问题。在此,非常感谢浪谷的解决方案。

  public static string GetSQLServerInstallPath()
{
string SQLPath = string.Empty;

RegistryKey hkml = Registry.LocalMachine;
RegistryKey MSSQLServerKey = hkml.OpenSubKey(@"SOFTWARE\MICROSOFT\MSSQLServer");
if (MSSQLServerKey != null)
{
string[] keys = MSSQLServerKey.GetSubKeyNames();
RegistryKey setupKey = MSSQLServerKey.OpenSubKey("Setup");
if(setupKey!=null)
{
SQLPath = setupKey.GetValue("SQLPath").ToString();
}
else
{
SQLPath = Get64BitRegistryKey(RegistryHive.LocalMachine, @"SOFTWARE\MICROSOFT\MSSQLServer\Setup", "SQLPath", RegistryView.Registry64);
}
}
return SQLPath;
}

/// <summary>
/// this method is use for the 32appliction to get the 64bit regestkey
/// </summary>
/// <param name="parentKeyName"></param>
/// <param name="subKeyName"></param>
/// <param name="keyName"></param>
/// <returns></returns>
public static string Get64BitRegistryKey(RegistryHive hive,string keyName,string valueName,RegistryView view)
{
Microsoft.Win32.SafeHandles.SafeRegistryHandle handle = new Microsoft.Win32.SafeHandles.SafeRegistryHandle(GetHiveHandle(hive),true);
RegistryKey subkey = RegistryKey.FromHandle(handle, view).OpenSubKey(keyName);
RegistryKey key = RegistryKey.FromHandle(subkey.Handle, view);
return key.GetValue(valueName).ToString();

}

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;
}

32位程序访问64位系统上的Windows注册表

时间: 2024-08-04 03:34:24

32位程序访问64位系统上的Windows注册表的相关文章

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

接上文:http://www.cnblogs.com/TaiYangXiManYouZhe/p/5086974.html 上代码: RegistryKey localKey; if (Environment.Is64BitOperatingSystem) localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); else localKey = RegistryKey.OpenBa

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

众所周知,取系统的安装时间可取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion的子项InstallDate,此值是个DWORD类型的UnixStamp.  但是在64位系统上有所不同(仅测试了win7.win8),默认情况下32程序在64位机器上访问的是下面这个地址HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion

C# 32位程序在64位系统下注册表操作

在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64位程序冲突 相关资料请查看32位程序在64位系统下运行的重定向机制 下面是以获取操作系统安装密匙KEY的案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

32位程序注入64位DLL到64位进程

向其它进程注入DLL通常的做法是通过调用CreateRemoteThread这个API在目标进程内创建一个远程线程.用这个线程来调用LoadLibraryA或LoadLibraryW(下文统称LoadLibrary)以实现让目标进程载入指定的DLL文件. 使用CreateRemoteThread创建一个远程线程须要传入一个线程过程函数的地址,而且这个函数地址是须要在目标进程中有效的. 因为LoadLibrary是kernel32.dll的导出函数.所以对于执行在同一个系统上的同为32位的进程或同

32位程序在64位电脑下运行,

操作的注册表写入和读取会被定位到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node下 但部份系统注册信息在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node下是没有的,所以就会导致32位程序在64位程序下执行出现异常.如HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography下MachineGuid在那个节点下是没有的 为了这个问题让我花了不少冤枉时间.在此记一下 32位程序在64位电脑下运行,

32位程序移植64位经验

最近移植了一个32位程序到64位,原本以为简单的事,折腾了好几天,现在记录下来过程,供有相关问题的人参考:程序是一个输入法,源代码来自盒子 http://www.2ccc.com/article.asp?articleid=2850,再此感谢刘麻子大侠,输入法大量的使用了windows定义的结构体或记录类型,涉及的数据类型很多,在32到64转换的过程中参考了http://blog.csdn.net/hpjx1987/article/details/51453586,首先感谢作者共享知识,但这里有

c#32位程序操作64位注册表

1 RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 2 try 3 { 4 localKey = localKey.OpenSubKey( 5 @"SOFTWARE\Macromedia", true); 6 if (localKey != null) 7 { 8 localKey.DeleteSubKe

关于32位程序在64位系统下运行中需要注意的重定向问题(有图,很清楚)

0x00 前言 最近学习了[email protected]的文章<Persistence Architecture Matters>,恰巧解决了我之前遇到过的一个问题,理清了文件和注册表重定向中需要注意的细节 大家在学习的过程中难免也会碰到,所以在此分享一下. <Persistence Architecture Matters>的链接:https://labs.mwrinfosecurity.com/blog/persistence-architecture-matters/ 0

iOS上应用如何兼容32位系统和64位系统

在苹果推出iPhone5S时,64位的应用就走到了眼前.当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位. 我记得自己刚刚接触电脑时还有16位的系统,指针的寻址范围还是16位的.当年用TurboC时,还要根据应用的大小选择是tiny模式还是其他.后来很长一段时间使用32位的模型编程,4G是牢牢记住的一个边界条件.而现在,64位走到了眼前. 就如同16位转向32位一样,硬件肯定是最先推出的,SDK也会跟进,然后各种第三方的应用才会逐步跟进,这个过程一般