3

我目前正在尝试获取所有自动运行的列表,但我在 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 中的项目不同。

4

2 回答 2

4

您的进程是 32 位进程,因此,在 64 位操作系统上,注册表重定向器开始发挥作用。密钥被重定向,它HKLM\Software有两个视图,一个是您的进程正在查找的 32 位视图,一个是 64 位视图。

确实,如果您运行 64 位进程,您将看到注册表的 64 位视图。然而,这还不是全部。Windows 处理CurrentVersion\Run来自注册表的 32 位和 64 位视图的条目。因此,如果您只是切换到 x64 或 AnyCPU 进程,那么您将丢失存储在 32 位注册表视图中的自动运行。

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

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

于 2012-12-01T14:10:46.177 回答
2

这是因为您的应用程序是为 x86 平台编译并在 64 位操作系统上运行的。MSDN上有一篇关于注册表重定向的综合文章

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

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

于 2012-12-01T13:32:11.880 回答