项目场景:

最近一个项目需要用到注册表。在用代码创建注册表子项时,抛出“对注册表项。。。访问被拒绝”的异常。


问题描述:

调用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)调试时,出现“对注册表项访问被拒绝”异常相关推荐

  1. Django幕学项目中邮箱注册Register注册新浪邮箱时,能注册成功,但是邮箱接收不到邮件的问题

    视频教程上用户注册功能view的代码是: class RegisterView(View):# get方法直接返回页面 def get(self, request):register_form = R ...

  2. mysql动态表单设计与实现_动态表单的数据库结构设计

    利用在线编辑器设计的表单,包含输入框,明细表(动态添加行)等需要存储到数据库的信息,现在有三种思路: 1.一个表单对应数据库的一张或多张物理表(主从表),这种设计在很多业务的情况下,其数据库的物理表会 ...

  3. PLSQL:导出表结构、导出整个表、导出表部分数据、复制表、导入表

    一:导出表结构 单击 "工具"--"导出用户对象"         (记得选中表) 导出之后是一个创建表的SQL(包含注释,表空间等表结构) 二:导出整个表 单 ...

  4. 【文件夹访问被拒绝】删文件夹的时候遇到“你需要权限来执行此操作 你需要来自 我的本\Administrator 的权限才能对此文件夹进行更改”

    删除文件夹时遇到问题:文件夹访问被拒绝 参考文章Windows提示"无法枚举容器中的对象.访问被拒绝"该如何解决? 删文件夹时遇到以下问题,文件夹访问被拒绝,你需要权限来执行此操作 ...

  5. mysql分页分表_mysql分表后 如何分页 (总共160个表1500万数据)

    mysql分表后,有160个表,有1500万数据,要怎么做分页列表? 之前是想用union all合并160个表的结果集..但直接卡的数据都出不来.. 请问这里应该怎么做分页,谢谢~~~ 回复讨论(解 ...

  6. 修改计算机 注册到 用户,电脑修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案...

    1.问题描述:开机电脑显示"无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失." 2.问题原因:想 ...

  7. Win10为将用户中文名修改为英文名而修改了注册表导致开机时电脑显示“无法登陆到你的账户”的问题简单解决方案

    Win10为将用户中文名修改为英文名而修改了注册表导致开机时电脑显示"无法登陆到你的账户"的问题简单解决方案 起因 为了将用户中文名修改为英文名,参考了站内多章大神的方法,结果导致 ...

  8. Windows 7安装软件时无法将注册值写入注册表

    Windows 7安装软件时无法将注册值写入注册表 | 浏览:4281 | 更新:2014-03-13 15:01 1 2 3 4 5 6 7 分步阅读 收到知友的提问:1.WIN7系统安装软件出现& ...

  9. 关于流水帐表序列号生成时的并发操作问题

    关于流水帐表序列号生成时的并发操作问题 1.某些流水张表的序号不是而是带有一定规则的,   如:四位的年份+2位周数+7位数字的序号       2007130000002.   假定表的定义如下: ...

最新文章

  1. 1024块TPU在燃烧!BERT训练从3天缩短到76分钟 | 技术头条
  2. python用selenium爬取网页数据_Python项目实战:使用selenium爬取拉勾网数据
  3. mysql数据采集中间件_开源 | MySQL数据传输中间件—DTLE
  4. c# 对文件流的读写
  5. 数据库的嵌套查询和统计查询
  6. 最佳的开源云项目有哪些?
  7. #includebits/stdc++.h包含C++的全部头文件
  8. selenium 实现循环点击_-循环点击遇到的坑(每次点击后返回,页面元素都会变化的解决方法)...
  9. 节省内存的嵌入式软件设计技巧
  10. 高阶的Parser:可变运算优先级
  11. 医学英文文献怎么找?
  12. 中国青年报:“宋祖德现象”考验道德与法
  13. 公众号申请并发布文章教程
  14. Flink CDC 2.3 发布,持续优化性能,更多连接器支持增量快照,新增 Db2 支持
  15. 如何才是一名优秀的好员工
  16. php面试自我介绍结束语,面试自我介绍的结束语
  17. 牛人林达华推荐有关机器学习的数学书籍
  18. 5G/NR 5G核心网(5GC)之网络功能服务通信
  19. Cocos Creator发布H5游戏,做项目构建流程定制
  20. proteus教程——读写AT24C02

热门文章

  1. python小游戏制作实验总结_20183202 实验四《python程序设计》实验报告
  2. 百度地图切换罗盘后不能正北
  3. 微信公众号开发:渠道二维码生成/粉丝来源归属统计打标签
  4. 顺丰科技运维开发工程师HR面面经
  5. 分享微信圈子申请理由怎么写,让你的圈子一次审核通过!
  6. 神器!这个 Python 神器竟能把图片视频无损清晰放大N倍!
  7. 吴恩达《机器学习系列课程》学习笔记(二):监督学习
  8. 《王者荣耀》爆红带动手游创业发展
  9. .NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
  10. 乐视网2亿元股权质押违约;美团打车回应约谈;贝索斯身家达到1051亿美元丨价值早报