2011-04-18 148 views
3

當使用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位系統上運行相同的代碼時,代碼無誤地執行。我幾乎傾向於認爲我可能在某處存在損壞的註冊表項?如果是這樣,關於如何找到損壞的密鑰的任何想法?

回答

2

合適地通過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