2012-12-01 75 views
3

我目前正在尝试获取所有autoruns的列表,但我在64位系统上苦苦挣扎。当我使用:如何从64位Windows注册表中读取启动项目?

My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", False) 

它表明我从条目:

My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run", False) 

任何人都知道为什么,和/或如何解决这一问题?

我还应该说明HKLM \ .. \ Run中的项目与HKLM \ .. \ Wow6432Node .. \ Run中的项目不同。

+0

为什么人们把这个话题当作话题投票,并建议向超级用户迁移? –

回答

4

您的过程是一个32位的过程,因此,在64位操作系统,registry redirector发挥作用。 HKLM\Software键被重定向,并且有两个视图,一个是您的进程正在查找的32位视图,另一个是64位视图。

确实,如果您运行64位进程,您将看到注册表的64位视图。但是,这不是完整的故事。 Windows从注册表的32位和64位视图中处理CurrentVersion\Run条目。因此,如果您只是切换到x64或AnyCPU进程,那么您将缺少存储在32位注册表视图中的自动运行。

因此,由于您的目标是列出所有自动运行,您将需要读取注册表的32位和64位视图。您可以使用在.net 4中引入的RegistryView枚举来实现此目的。这允许32位进程访问注册表的64位视图。事实上,它允许一个64位进程访问注册表的32位视图。

如果您想要一个在32位和64位系统上运行的进程,您将需要以x86或AnyCPU为目标。然后,如果检测到您在64位系统上运行,则使用RegistryView来读取注册表的两个视图。

+0

哦,我明白了!非常感谢! – user1868697

2

这是因为您的应用程序是针对x86平台编译并在64位操作系统上运行的。有上Registry Redirection上MSDN

通过 一个comprensive文章注册表重定向器隔离32位和64位应用程序提供关于WOW64注册表 的某些部分的单独的逻辑视图。注册表重定向程序截取32位和64位的注册表调用到其各自的逻辑注册表视图,并将它们映射到相应的物理注册表位置。对应用程序来说,重定向 过程是透明的。因此,如果它在32位 的Windows,即使数据被存储在不同的位置上的64位 的Windows

你可以解决这个问题上运行32位 应用程序可以访问的注册表数据编译您的应用程序的任何CPU平台

+0

谢谢你的帮助!永远不会猜到这是事实! – user1868697

相关问题