2017-03-17 87 views
2

我們試圖使用C#將密鑰值對添加到Windows註冊表中。將密鑰寫入C#中的Windows註冊表中

寫入密鑰是另一個用戶的環境變量。用戶將是服務用戶,並且從不登錄。

我們已經可以通過P/Invoking LoadUserProfile獲得用戶SID並將其添加到註冊表中。

然而,試圖寫入環境子項有當一個問題:

 using (var key = Registry.Users.OpenSubKey(userSid + "\\Environment")) 
     { 
      if (key == null) 
      { 
       Debug.WriteLine("Key was null (typical)"); 
       return; 
      } 

      key.SetValue("A", "B"); 
     } 

這將引發UnauthorizedAccessException與真正有用的消息

無法寫入註冊表項

該應用程序以管理員身份運行。

由於顯而易見的原因,我猜測這是與安全訪問控制有關。我可以使用var security = key.GetAccessControl();獲得訪問控制。但是,我不知道要將哪些值更改爲能夠寫入環境。

只是爲了記錄,我可以將值寫入其他一些鍵,如HKEY_USERS本身或HKEY_LOCAL_MACHINE本身,但我不能寫入HKEY_LOCAL_MACHINE\Public例如。

這裏是堆棧跟蹤,如果有幫助:

************** Exception Text ************** 
System.UnauthorizedAccessException: Cannot write to the registry key. 
    at System.ThrowHelper.ThrowUnauthorizedAccessException(ExceptionResource resource) 
    at Microsoft.Win32.RegistryKey.EnsureWriteable() 
    at Microsoft.Win32.RegistryKey.SetValue(String name, Object value, RegistryValueKind valueKind) 
    at Microsoft.Win32.RegistryKey.SetValue(String name, Object value) 
    at TestingEnvVariables.Form1.GetVariablesButtonClick(Object sender, EventArgs e) 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
+1

該應用程序是否正在運行「以管理員身份運行」。如果沒有,請嘗試。它看起來像,你沒有寫權限。 –

+1

@MuralidharanDeenathayalan - 是的,它運行在「以管理員身份運行」 –

+1

嘗試模擬用戶,使用您獲得的相同用戶令牌來調用'LoadUserProfile'。 –

回答

1

賓果!

MSDN articleRegistryKey.OpenSubKey(String)

獲取爲只讀一個子項。

你需要RegistryKey.OpenSubKey(String, Boolean)MSDN article):

檢索指定的子項,並指定寫訪問是否是被應用到的關鍵。

+0

就是這樣!我真是個白癡!基本的錯誤!感謝Harry Johnston。 –