2012-02-07 96 views
0

如果有人能帮我解决我遇到的问题,我将不胜感激。无法访问Windows Server 2008企业版上的HKEY_CLASSES_ROOT Installer

我在C#写了一个简单的程序,以检查是否存在以下项 HKEY_CLASSES_ROOT \ Installer程序\ UpgradeCodes \ product_upgrade_GUID

它在所有Windows返回true(如果该键存在),除了在Windows Server企业2008年的x64 SP2虽然密钥存在,但它返回System.NullReferenceException。 其实,如果我尝试访问\ Installer注册表中的任何键,我会得到NullReferenceException。它看起来像这个安装程序密钥是以某种方式保护。 尝试访问“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes”键时发生同样的事情。

下面的代码应返回 “HKEY_CLASSES_ROOT \ Installer程序”,但它返回的NullReferenceException:

RegistryKey rk = Registry.ClassesRoot.OpenSubKey(@"Installer"); 
return rk.ToString(); 

有谁知道访问安装的Windows注册表进行任何限制? (UAC被禁用,用户为admin)

谢谢

+0

CAn您以管理员身份访问注册表中的注册表项。 – 2012-02-07 17:10:56

回答

1

最有可能你是在64位系统上运行32位程序和registry redirector正在你对注册表的32位视图。那些钥匙不存在的地方。

选项包括:

  • 打开使用RegistryView枚举注册表的64位视图。请注意,这需要.net 4.对于旧版本的.net,您需要使用p/invoke从32位进程读取注册表的64位视图。
  • 切换到64位进程。
+0

嗨, 我不得不使用.net 3.5,但我不认为问题是注册表重定向。 我已经检查过,我可以访问安装程序以外的任何注册表。 例如,如果我创建密钥HKEY_CLASSES_ROOT \ Installer11 \ 我可以访问它。 – harrygg 2012-02-07 18:56:37

+0

你的过程是32位吗? – 2012-02-07 19:31:44

+0

是的,它是32位。我可以使它成为64位,因为它不会在32位操作系统上运行。 – harrygg 2012-02-08 07:27:16