C#访问64位注册表

11

我想知道在64位电脑上是否有可能使用C#访问以下注册表键:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

在32位电脑上访问时,它可以正常工作,但在64位电脑上会将其重定向到HKLM\SOFTWARE\Wow6432Node的本机64位路径,其中包含不同的键。我已经查看了各种文章,但无法找到确切的答案来访问64位电脑上的32位键。谢谢。


1
你的目标是哪个版本的 .Net Framework? - Justin
我正在使用VS 2010,所以我猜是.NET 4。 - Bali C
5个回答

15

5
在x64中编译您的应用程序,一切都应该很好。在Visual Studio 2010中,您可以通过更改项目属性>构建下的设置来实现。
对于VS Express用户:
在VC# Express中,此属性缺失,但是如果您知道要查找的位置,仍然可以创建x86配置。这看起来像一长串步骤,但一旦您知道这些东西在哪里,就会变得更加容易。只有VC# Express的任何人都可能会发现这个有用。一旦您了解了配置管理器,下次就会更加直观。
1. 在VC# Express中,转到工具 ->选项。 2. 在选项对话框的左下角,选中"显示所有设置"复选框。 3. 在左侧的树视图中,选择“项目和解决方案”。 4. 在右侧的选项中,选中“显示高级构建配置”复选框。 5. 单击“确定”。 6. 转到生成 ->配置管理器... 7. 在项目旁边的平台列中,单击组合框并选择""。 8. 在“新平台”设置中,选择“x64”。 9. 单击“确定”。 10. 单击“关闭”。 11. 现在,您拥有了一个x64配置!简单如蛋糕! :-)

谢谢,这只适用于Visual Studio Pro吗?我正在使用Express,找不到这个选项? - Bali C
@Bali,我已经编辑了我的答案,并附上了希望能够适用的指示,取自http://forums.create.msdn.com/forums/t/4377.aspx#22601。请尝试一下吧 :) - foxy
虽然您已经接受了这个答案,但是您必须意识到创建一个64位可执行文件将意味着您的应用程序无法在32位Windows上运行。这符合您的期望吗? - David Heffernan
嗯,我没有意识到这一点,但我会将其作为被接受的答案保存下来,因为我可能会创建单独的32位和64位应用程序,感谢您指出这一点。 - Bali C

5

项目 + 属性,生成选项卡,平台目标 = Any CPU。从32位应用程序访问64位注册表需要使用 .NET 4 和新的 RegistryKey.OpenBaseKey() 方法,并选择 RegistryView.Registry64 选项。

这只允许你读取键值,写入键值需要进行用户账户控制(UAC)提权。你可以在不受注册表重定向影响的情况下,在 HKCU 写入键值。


2
你把它搞反了,Wow6432Node 是为 32 位应用程序设计的。因此,如果你的应用程序是 32 位(x86),那么你会自动被重定向到该“节点”。
你可以在 .NET 4 中使用 FromHandle 方法来指定要使用哪个视图,但它的使用并不是很明显,并且可能会出现 问题
这个 答案 使用 Win32 API 来解决这个问题,你也可以在 C# 中利用它。

1

它应该进行重定向。您需要检测此重定向并读取WoW6432Node键。HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run是64位注册表,只能由64位应用程序访问。

显然,您应编写支持两者的代码。


@David - 我必须不同意你的评论。将重定向到HKLM\SOFTWARE\Wow6432Node对于32位应用程序来说是未知的。如果您认为可以为我的答案添加澄清,我会很感激(而不是毫无根据地声称我是错误的)。 - Security Hound
你说得对,我表达不清楚。抱歉。HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 是一个无意义的键。Shell 读取 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 中的值。它可能会读取32位区域中的值,以应对那些写错位置的程序,但正确的写入值的位置是在64位部分。 - David Heffernan
@David - 我不认为你是对的。32位进程不会写入64位操作系统所用的键。试图写入/读取HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run的32位程序将被重定向到HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Run,但它们并不完全相同,因此如果您正在处理32位程序,则必须实际读取HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Run。 - Security Hound
拥有并读取此密钥的应用程序是 shell,它是一个 64 位进程。 - David Heffernan
实际上,在这种情况下,CurrentVersion\Run 列表的 32 位和 64 位版本都会被处理。因此,实际上你写入哪个版本并不重要。我假设 OP 想要写入这个键。但原则是相同的。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接