如何从64位Windows上的注册表中读取启动项?

时间:2012-12-01 13:22:10

标签: windows vb.net registry 64-bit

我目前正在尝试获取所有autoruns的列表,但我在64位系统上苦苦挣扎。当我使用时:

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。

2 个答案:

答案 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读取注册表的两个视图。

答案 1 :(得分:2)

之所以发生这种情况,是因为您的应用程序是针对x86平台编译的,并且运行在64位操作系统上。 MSDN上的Registry Redirection上有一篇综合文章

  

注册表重定向程序隔离32位和64位应用程序   提供注册表某些部分的单独逻辑视图   在WOW64上。注册表重定向器拦截32位和64位   注册表调用各自的逻辑注册表视图和映射   他们到相应的物理注册表位置。重定向   流程对应用程序是透明的。因此,一个32位   应用程序可以访问注册表数据,就像它在32位上运行一样   Windows,即使数据存储在64位的不同位置   视窗

您可以解决为AnyCPU平台编译应用程序的问题