2012-02-29 146 views
13

我在以下注冊表項:Registry.GetValue總是返回null

下:HKEY_LOCAL_MACHINE\SOFTWARE\RSA我有值對象調用 - WebExControlManagerPath,其價值是c:\

我試圖做到這一點:

var r = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\RSA", "WebExControlManagerPth",null); 

if(r!=null) 
    ProcessAsUser.Launch(ToString()); 

r值始終爲空。

enter image description here

任何想法?

+0

我嘗試這樣做,它也返回null – MoShe 2012-02-29 00:37:12

回答

18

您不像在批處理腳本中那樣訪問HKEY_LOCAL_MACHINE配置單元,就像在C#中一樣。你叫Registry.LocalMachine,因爲這樣的:

 RegistryKey myKey = Registry.LocalMachine.OpenSubKey(@"Software\RSA", false); 
     String value = (String)myKey.GetValue("WebExControlManagerPth"); 

     if (!String.IsNullOrEmpty(value)) 
     { 
      ProcessAsUser.Launch(ToString()); 
     } 

更新:

如果返回null,設置您的構建架構任何CPU。操作系統可能以不同方式虛擬化32位和64位註冊表。參見:http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx,Reading 64bit Registry from a 32bit applicationhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx

+0

嘗試它 - 越來越空.... – MoShe 2012-02-29 00:38:36

+0

我只是上傳屏幕截圖 – MoShe 2012-02-29 00:43:40

+1

你有管理權限?本地機器配置單元需要管理權限才能寫入。我不確定是否需要管理權限才能閱讀,但它們可能是空字符串的原因。 JK,對我也是零。 – Jason 2012-02-29 00:45:27

1

我在路徑的開始處有額外的「\」,請確保設置正確。

29

Jasonstatement是對的,操作系統是問題,下面的代碼會幫你解決。

RegistryKey localKey; 
if(Environment.Is64BitOperatingSystem) 
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
else 
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32); 

string value = localKey.OpenSubKey("RSA").GetValue("WebExControlManagerPth").ToString(); 
+1

優秀的解決方案,無需編譯「任何CPU」..這應該是最好的答案。 – 2015-06-10 02:14:11

+0

僅供參考,這隻適用於.NET 4.0及以上版本.. – Ignatius 2015-08-10 08:08:15

+1

@Ignatius,我沒有在下面的.NET 4.0中進行檢查。感謝您的信息:) – 2015-08-10 11:07:09

2

,如果你使用的是64位操作系統,當你試圖讓 HKEY_LOCAL_MACHINE\SOFTWARE\RSA它實際上是在尋找HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\RSA 這就是爲什麼你會得到空

+2

這將是一個更好的答案,如果你也提供一些解決方案。如果沒有,請將此作爲對問題的評論。 – 2015-02-09 13:38:56