項目場景:
最近一個項目需要用到注冊表。在用代碼創建注冊表子項時,拋出“對注冊表項。。。訪問被拒絕”的異常。
問題描述:
調用RegistryHelper.CreateSubKey 的 var _subKey = m_registryKey.CreateSubKey("SOFTWARE\\" + subKeyString);這句時拋出異常
RegistryHelper注冊表幫助類
using Microsoft.Win32;
using System;
using System.Diagnostics;namespace LchHelper
{public class RegistryHelper{#region construct function 注冊表操作public RegistryHelper(){}#endregion#region fields(fields
)private static RegistryKey m_registryKey
= Registry
.LocalMachine
; #endregion#region CreateSubKey 創建注冊表項public static bool CreateSubKey(string subKeyString
= "LCHTest"){bool _result
;try{if (IsRegeditItemExist(subKeyString
)){return true;}var _subKey
= m_registryKey
.CreateSubKey("SOFTWARE\\" + subKeyString
);_result
= _subKey
!= null ? true : false;}catch (Exception ex
){Debug
.WriteLine($"CreateSubKey{subKeyString}異常:{ex.Message}");_result
= false;}return _result
;}#endregion#region DeleteSubKey 刪除注冊表項public static bool DeleteSubKey(string subKeyString
= "LCHTest"){bool _result
;try{m_registryKey
.DeleteSubKey("SOFTWARE\\" + subKeyString
, true);m_registryKey
.Close();_result
= true;}catch (Exception ex
){Debug
.WriteLine($"CreateSubKey{subKeyString}異常:{ex.Message}");_result
= false;}return _result
;}#endregion#region SetValue 鍵值的創建與修改[無則創建,有則修改]public static bool SetValue(string name
, string value, string subKeyString
= "LCHTest"){try{if (string.IsNullOrWhiteSpace(name
) || string.IsNullOrWhiteSpace(subKeyString
)){return false;}if (!CreateSubKey()){return false;}var _subKey
= m_registryKey
.OpenSubKey("SOFTWARE\\" + subKeyString
, true);_subKey
.SetValue(name
, value);m_registryKey
.Close();return true;}catch (Exception ex
){Debug
.WriteLine($"SetValue:{name}:{value}:{subKeyString}異常:{ex.Message}");return false;}}#endregion#region GetValue 獲取鍵對應的值public static string GetValue(string name
, string subKeyString
= "LCHTest"){try{if (!IsRegeditKeyExit(name
, subKeyString
)){return "";}var _subKey
= m_registryKey
.OpenSubKey("SOFTWARE\\" + subKeyString
);string value = _subKey
.GetValue(name
).ToString();_subKey
.Close();return value;}catch (Exception ex
){Debug
.WriteLine($"GetValue:{name}:{subKeyString}異常:{ex.Message}");return "";}}#endregion#region DeleteValue 刪除鍵值public static bool DeleteValue(string name
, string subKeyString
= "LCHTest"){try{var _subKey
= m_registryKey
.OpenSubKey("SOFTWARE\\" + subKeyString
, true);_subKey
.DeleteValue(name
);_subKey
.Close();return true;}catch (Exception ex
){Debug
.WriteLine($"DeleteValue:{name}:{subKeyString}異常:{ex.Message}");return false;}}#endregion#region IsRegeditItemExist 注冊表項是否存在private static bool IsRegeditItemExist(string subKeyString
){var _software
= m_registryKey
.OpenSubKey("SOFTWARE");var _subkeyNames
= _software
.GetSubKeyNames();foreach (string keyName
in _subkeyNames
){if (keyName
== subKeyString
){m_registryKey
.Close();return true;}}m_registryKey
.Close();return false;}#endregion#region IsRegeditKeyExit 鍵是否存在private static bool IsRegeditKeyExit(string name
, string subKeyString
= "LCHTest"){if (!IsRegeditItemExist(subKeyString
)){return false;}var _subKey
= m_registryKey
.OpenSubKey("SOFTWARE\\" + subKeyString
);var _subkeyNames
= _subKey
.GetValueNames();foreach (string keyName
in _subkeyNames
){if (keyName
== name
){m_registryKey
.Close();return true;}}m_registryKey
.Close();return false;}#endregion}
}
調用代碼
RegistryHelper
.CreateSubKey();
RegistryHelper
.SetValue("lch", "just test");
原因分析:
根據提示信息,有很大可能是操作注冊表權限不夠導致的。當前系統的登錄用戶為管理員。當以管理員身份運行 vs,再加載項目時就沒有拋出異常。
以管理員身份運行 vs
正常執行
注冊表(win+r,regedit)
HKEY_LOCAL_MACHINE\SOFTWARE可以找到新建的LCHTest(沒找到就先刷新一下)
解決方案:
綜上,問題產生愿意是沒有管理員權限(沒有操作注冊表權限)。 因此要確保程序在運行中有管理員權限,否則就無法操作注冊表。
確保程序在運行中有管理員權限,可參考
Cosmic_Spy 的 C#程序以管理員權限運行https://www.cnblogs.com/Interkey/p/RunAsAdmin.html
方法一:通過 System.Diagnostics.Process.Start() 方式啟動:
由于通過System.Diagnostics.Process.Start() 方式外部調用啟動,所以無法加斷點調試
方法二:通過添加應用程序清單文件:
可具體參考 kucoffee12 的 C#獲取管理員權限 https://blog.csdn.net/kucoffee12/article/details/100176821
如果在VS中 啟動調試 的話,就會提示 此任務要求應用程序具有提升的權限
方法三:直接修改程序文件的屬性
總結
以上是生活随笔為你收集整理的winform 操作注册表(RegistryHelper)调试时,出现“对注册表项访问被拒绝”异常的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。