RegistryKey.GetSubKeyNames抛出IOException异常

问题描述:

当使用RegistryKey.GetSubKeyNames,一个IOExeption抛出:RegistryKey.GetSubKeyNames抛出IOException异常

“没有更多的数据是可用”

下面是相关代码:

string subKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"; 
RegistryKey key = Registry.LocalMachine.OpenSubKey(subKey); 
string[] keys = key.GetSubKeyNames(); // throws IOException here 

规格

  • Win7的X64
  • VS 2010 SP1
  • .NET 3.5

例外是使用 “任何CPU” 的生成类型时抛出;当使用构建类型“x86”时,代码按预期执行,但是从“Wow6432Node”中读取密钥,而不是上面定义的subKey字符串变量中指定的SubKey路径。

问题是:如何读取64位系统(而不是Wow6432Node)上定义的subKey路径中的所有子密钥?

注意:当我在另一个64位系统上运行相同的代码时,代码无误地执行。我几乎倾向于认为我可能在某处存在损坏的注册表项?如果是这样,关于如何找到损坏的密钥的任何想法?

合适地通过RegistryViewRegistryKey.OpenBaseKey()

例如:

RegistryKey tempRegKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"); 
+0

'OpenBaseKey'似乎是一个4.0方法。我应该说.NET 3.5。但是,我使用'OpenBaseKey'在4.0下运行了一个测试,并且发生了“没有更多数据可用”的异常。奇怪的是,我可以得到钥匙的数量;但不能列举关键名称。 – 2011-04-18 17:16:27

+0

然后,这似乎是一个安全问题 - 但只是一个预感... – Aliostad 2011-04-18 20:04:35

+0

我是系统上的完整管理员。我曾尝试重置SubKey上的所有权限,并让子项继承权限,但失败时出现类似“不是所有项都可更新”的错误。有200多个SubKeys,并且必须手动检查每个人的许可将成为PITA。我已经用手重新设置了它们的十分之一......它慢了。 – 2011-04-18 21:18:09