2009-12-17 81 views
0

我設置註冊表設置,如果值在[HKEY_CURRENT_USER]中,但是如果值在[HKEY_CURRENT_USER \ Software \ Adob​​e \ Acrobat Reader \ 9.0 \ ethan]中,我可以這樣做,錯誤:C#註冊表設置

前{ 「無法寫入註冊表項。」} {System.Exception的} System.UnauthorizedAccessException的

沒有人知道什麼可能是錯了嗎?請參見下面的代碼:從運行框中

private string setRegKey(string machinename) 
    { 
     try 
     { 
      RegistryKey regKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machinename).OpenSubKey("Software").OpenSubKey("Adobe").OpenSubKey("Acrobat Reader").OpenSubKey("9.0").OpenSubKey("ethan"); 
      regKey.SetValue("Test", 1); 
      regKey.Close(); 
      return "Success"; 
     } 
     catch (Exception ex) 
     { 
      return "Error: " + ex.ToString(); 
     } 
    } 
+1

的Win7或Vista?如果是這樣,它可能是正在運行的用戶的安全級別。 – kenny 2009-12-17 23:14:13

+1

遠程機器上的當前用戶?這有什麼用? – 2009-12-18 02:02:10

回答

0

運行REGEDT32.EXE將打開註冊表編輯器版本的,它允許您查看每個註冊表項設置的權限。您可以使用它來確定您需要編輯密鑰的權限。下一步將確保應用程序運行的帳戶具有適當的權限。 如果在啓用了用戶訪問控制的情況下運行該應用程序,則可能需要通過按住shift鍵同時右鍵單擊該exe文件並選擇「以管理員身份運行」選項啓動該應用程序。 (這是提升應用程序的含義)

1

你真的想改變遠程機器上的設置嗎?如果用戶是域用戶,我想這可能工作。

無論如何,有一點需要注意的是,每次調用'OpenSubKey'時,您都會得到一個RegistyKey對象的新實例,並且每個對象都需要被丟棄。否則,你會開始泄漏註冊表句柄,因爲框架中的最終化錯誤(這可能已經修復,但我感到厭惡)。

另外,沒有必要單獨打開每個節點的密鑰(除非這與遠程打開的密鑰有關?)。我建議在try塊中的代碼更改爲以下:

using (RegistryKey remoteUserKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machinename)) 
using (RegistryKey remoteKey = remoteUserKey.OpenSubKey(@"Software\Adobe\Acrobat Reader\9.0\ethan")) 
{ 
    remoteKey.SetValue("Test", 1); 
    return "Success"; 
} 

如果您不需要遠程更改,刪除前兩行,並用這個代替:

using (RegistryKey key = Registry.LocalUser.OpenSubKey(@"Software\Adobe\Acrobat Reader\9.0\ethan"))