2012-03-24 146 views
2

當我運行以下命令時,rKey有兩個值。註冊表和註冊表配置單元有什麼區別

RegistryKey sqlServer = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server", false); 

當我運行以下任一命令的(在相同的機器以相同的用戶上)我發現沒有值;

RegistryKey sqlServer64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 

    RegistryKey sqlServer32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32); 

任何人都可以指向我的答案或描述的蜂巢vs普通的註冊表訪問?

編輯: 我做的事後爲:

StringBuilder sbKeys = new StringBuilder(); 

    foreach (var key in sqlServer.GetValueNames()) 
    { 
     sbKeys.AppendLine(key); 
    } 

對於所有RegistryKeys。對於sqlserver,我看到兩個值,對於sqlServer32和SqlServer64,沒有值。

+4

你需要顯示你用'sqlServer64'和'sqlServer'來做什麼。 「@」SOFTWARE \ Microsoft \ Microsoft SQL Server「'進入第二個變體的位置在哪裏? – 2012-03-24 19:11:40

+1

接下來你必須使用OpenSubKey()。 – 2012-03-24 19:34:43

+0

@大衛我更新了我的posrt – 2012-03-24 20:00:07

回答

1

第二個變體中的問題是您未能打開子密鑰。您的sqlServer.GetValueNames()調用在特定配置單元的根級別運行。

你需要的是這樣的:

RegistryKey root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
RegistryKey sqlServer = root.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"); 
foreach (var key in sqlServer.GetValueNames()) 
{ .... } 

完成這樣它沒有從你的第一個變體(除註冊表視圖)不同。我期望使用適當的註冊表視圖將導致您的other question解決方案。

當然,你會想在上面的代碼中添加一些錯誤檢查。

+0

感謝大衛,我從漢斯對我的帖子的評論中得到了一些暗示,並且已經陷入了愚蠢的境地(並在此之後解決了問題)。雖然接受將去漢斯! – 2012-03-24 20:10:50