日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

winform 操作注册表(RegistryHelper)调试时,出现“对注册表项访问被拒绝”异常

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 winform 操作注册表(RegistryHelper)调试时,出现“对注册表项访问被拒绝”异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目場景:

最近一個項目需要用到注冊表。在用代碼創建注冊表子項時,拋出“對注冊表項。。。訪問被拒絕”的異常。

問題描述:

調用RegistryHelper.CreateSubKey 的 var _subKey = m_registryKey.CreateSubKey("SOFTWARE\\" + subKeyString);這句時拋出異常


RegistryHelper注冊表幫助類

using Microsoft.Win32; using System; using System.Diagnostics;namespace LchHelper {/// <summary>/// 注冊表操作/// </summary>public class RegistryHelper{//================== construct function ===================#region construct function 注冊表操作/// <summary>/// 注冊表操作/// </summary>public RegistryHelper(){}#endregion//=================== private fields ======================#region fields(fields)private static RegistryKey m_registryKey = Registry.LocalMachine; #endregion//==================== public method ======================/* SunKey */#region CreateSubKey 創建注冊表項/// <summary>/// 創建注冊表項/// </summary>/// <returns></returns>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 刪除注冊表項/// <summary>/// 刪除注冊表項/// </summary>/// <returns></returns>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/* Value */#region SetValue 鍵值的創建與修改[無則創建,有則修改]/// <summary>/// 鍵值的創建與修改[無則創建,有則修改]/// </summary>/// <returns></returns>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 獲取鍵對應的值/// <summary>/// 獲取鍵對應的值/// </summary>/// <returns></returns>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 刪除鍵值/// <summary>/// 刪除鍵值/// </summary>/// <returns></returns>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//==================== private method =====================#region IsRegeditItemExist 注冊表項是否存在/// <summary>/// 注冊表項是否存在/// </summary>/// <returns></returns>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 鍵是否存在/// <summary>/// 鍵是否存在/// </summary>/// <returns></returns>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)调试时,出现“对注册表项访问被拒绝”异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。