原文:【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法

项目 - 属性 - 安全性,“使用ClickOnce”生成app.mainfest,再取消“使用ClickOnce”,修改app.mainfest如下:

<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC 清单选项
如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换
requestedExecutionLevel 节点。 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 如果您希望利用文件和注册表虚拟化提供
向后兼容性,请删除 requestedExecutionLevel 节点。
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>

  

【另有一篇参考文章:http://blog.csdn.net/wonsoft/article/details/6598407

在XP/2003下调试得好好的程序,到了windows7下,却抛出“不允许所请求的注册表访问权”的异常,该异常就在读写注册表时引发,例:

  1. public class Program
  2. {
  3. public static void SetAutoRun(string keyName, string filePath)
  4. {
  5. using (RegistryKey runKey = Registry.LocalMachine.OpenSubKey(@"software\microsoft\windows\currentversion\run", true))
  6. {
  7. runKey.SetValue(keyName, filePath);
  8. runKey.Close();
  9. }
  10. }
  11. static void Main()
  12. {
  13. string keyName = "TestAutoRun";
  14. string fliePath = @"D:\CSharpProject\CSharp_Learn\MyDelegate.exe";
  15. SetAutoRun(keyName, fliePath);
  16. }
  17. }
  18. }

该程序如在windows 7下运行,需以管理员权限运行。

【方法一】

注册表

代码访问安全性策略必须向使用 Microsoft.Win32.Registry 类访问注册表的代码授予 RegistryPermission。这个权限类型可以用于限制对特定注册表项和子注册表项的注册表访问,还可以控制代码读取、写入或创建注册表项和已命名的值的能力。

约束注册表访问

要约束代码对特定注册表项的访问,可以使用带 SecurityAction.PermitOnly 的 RegistryPermissionAttribute。下面的属性确保代码仅可以读 HKEY_LOCAL_MACHINE\SOFTWARE 下面的 YourApp 注册表项(及子项)。

[RegistryPermissionAttribute(SecurityAction.PermitOnly, Read=@"HKEY_LOCAL_MACHINE\SOFTWARE\YourApp")] public static string GetConfigurationData( string key, string namedValue ) { return (string)Registry. LocalMachine. OpenSubKey(key). GetValue(namedValue); }

请求 RegistryPermission

要记录代码的权限要求,并确保在代码访问安全性策略没有授予它充分的注册表访问权限时程序集无法加载,应当添加带 SecurityAction.RequestMinimum 的程序集级 RegistryPermissionAttribute,如下面的示例所示。

[assembly:RegistryPermissionAttribute(SecurityAction.RequestMinimum, Read=@"HKEY_LOCAL_MACHINE\SOFTWARE\YourApp")]

【方法二】

添加 应用程序清单文件,在其中加入

  1. <security>
  2. <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
  3. <!-- UAC 清单选项
  4. 如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换
  5. requestedExecutionLevel 节点。
  6. <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
  7. <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
  8. <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
  9. 如果您希望利用文件和注册表虚拟化提供
  10. 向后兼容性,请删除 requestedExecutionLevel 节点。
  11. -->
  12. <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
  13. </requestedPrivileges>
  14. </security>

修改代码,如下:

  1. System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
  2. System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal( identity );
  3. if(principal.IsInRole( System.Security.Principal.WindowsBuiltInRole.Administrator ))
  4. {
  5. // 修改注册表
  6. }
  7. else
  8. {
  9. System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
  10. startInfo.FileName = System.Windows.Forms.Application.ExecutablePath; // 获取当前可执行文件的路径及文件名
  11. //以下 Args 为启动本程序的对应的参数
  12. startInfo.Arguments = String.Join( " ", Args );
  13. startInfo.Verb = "runas";
  14. System.Diagnostics.Process.Start( startInfo );
  15. }
问题描述:
为了实现程序的自动启动,我们会再注册表中写入相关信息,实现代码如下:
RegistryKey HKLM = Registry.LocalMachine;
RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
 
 
但总提示如上图的错误,困扰了我很久。编译后的的exe以管理员身份运行没有问题,为什么呢?难道VS在调试的是没有管理员身份(实际也没有必要),百思不得其解。。。终于发现在win7用vs访问注册表键HKEY_LOCAL_MACHINE没有管理员身份是不行,但访问HKEY_CURRENT_USER可以,所以上面的代码修改为:
RegistryKey HKLM = Registry.CurrentUser;
RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
现在OK了。
 
 
参考:《Windows 7软件开发示例:UAC、系统版本、权限》

看到Win7的酷炫功能流口水,已经忍不住想拥抱呢?别急,Win7的脾气可不好,要想拥抱它的新功能,我们的软件必须嫁给它——在Win7下能正常运行。,个人开发者开发的中小软件,功能相对简单,与系统的紧密程度普遍较低,添加一些Win7必要的正常运行的元素就OK啦!

  嫁给Win7的必要条件

  我们必须要给软件添加的是系统版本检测和安装路径选择元素,为什么要考虑它们呢?

  必要条件1:检测系统版本

  软件在运行初期需要判断操作系统的类型及版本号,并根据操作系统类型执行特定的代码,相同的功能在不同操作系统上可能会执行不同的代码。大多数软件的在Win7下无法正常运行都是因为判断操作系统版本失败造成的。

  当版本检测出错时,很多软件也会跟着出错,用户可能会发现双击软件图片后,什么反映都没有,或者可能会看到一个对话框“你必须运行在Microsoft Windows XP或更新版本”,但实际上计算机已经安装了Win7 。

  必要条件2:适应用户权限

  Win7默认运行的是非管理员账号,权限相对较小。而软件的安装程序会往包括系统盘的Program Files、Windows安装目录、注册表中写入一些数据(软件在运行时可能会将一些用户数据保存到系统文件夹或注册表中),如果当前用户的权限不够,软件就无法正常入驻Win7。

  小知识: UAC是一种降低Windows用户默认权限的办法,这样会给用户带来安全性的提高,它可以一定程度上遏制了一些病毒的发作——关闭杀毒软件、启动复制及散播病毒进程、注入网游客户端、监听键盘操作从而盗窃密码。

  例如数据看似保存成功,在写入的地点却找不到,或者注销切换到另一个Windows用户时,无法找到保存的数据。引起这类问题的根源是Win7的UAC机制,它降低了Windows用户的默认权限,使得一些普通操作无法更改系统设置及系统保护的文件夹。

  小提示:软件要结合系统某些功能时,需要调用相应的API。API调用得当否,对软件运行非常关键,我们从下期开始结合Win7酷炫功能,单独介绍如何正确的调用。Win7最新的API,有Win7特有的任务栏个性化快捷菜单(Jump List)、程序图标轮廓效果(Icon Overlay)、程序图标进度条效果(Progress Bar)、标签式缩略图(Tabbed Thumbnail)和缩略图工具栏(Thumbnail Toolbar)……

  “婚礼”必要的元素

  我们的软件要顺利嫁给Win7,在软件中要添加以下的元素。

  1.代码检测操作系统版本号

  在软件中添加判断操作系统是Win7 或2008 Server的代码:

  C#

      if (Environment.OSVersion.Version > new Version(5, 1))
      {MessageBox.Show("Windows 7 or Windows 2008 Server","Operating System", 
                      MessageBoxButtons.OK,MessageBoxIcon.Error);
            return;
      }

  2.尽量将数据存储在非系统盘

  软件不要默认安装到系统盘,在编写软件安装路径时,要考虑这个。此外,还需要在软件中添加修改读写注册表的代码,使用HKEY_CURRENT_USER\Software下的键值作为存储数据的结点:

        static void Main(string[] args)
        {
            var registryKey = Registry.CurrentUser.CreateSubKey(
                @"Software\test");
            registryKey.SetValue("name", "zswang");
            registryKey = Registry.CurrentUser.OpenSubKey(@"Software\test");
            Console.WriteLine(string.Format("{0}={1}\r\n",
               "name", registryKey.GetValue("name")));
        }

  3.提高程序的运行权限

  如果用户使用了管理员身份进入系统,又希望把软件安装在系统盘,又该如何呢?需要判断用户权限的权限,简单的解决方案是添加清单文件。在可执行文件夹中找到与可执行文件相同名字且扩展名.manifest的文件,输入以下代码即可:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="test"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法的更多相关文章

  1. windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法(转载)

    windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法 转自:https://www.cnblogs.com/sufferingStriver/p/m ...

  2. 转 A 、B两张表,找出ID字段中,存在A表,但是不存在B表的数据

    A.B两张表,找出ID字段中,存在A表,但是不存在B表的数据,A表总共13W数据,去重后大约3万条数据,B表有2W条数据,且B表的ID有索引. 方法一 使用not in,容易理解,效率低. selec ...

  3. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法

    这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...

  4. Windows 10 技术预览版9926 “未知源”引起系统休眠后自启的解决办法

    问题的由来: 自从安装上了最新发布的Windows 10 ,使用起来有诸多的改进:无论是重绘的图标还是通知消息中心的整合还是更智能的OneDrive客户端都使得工作起来非常愉悦. 不过笔者这两天频繁遇 ...

  5. Silverlight无法启动调试,错误“Unable to start debugging. The Silverlight Developer Runtime is not installed. Please install a matching version.” 解决办法

    今天调试Silverlight出现了以下错误: 意思是“无法启动调试,因为Silverlight Developer Runtime没有安装,请安装一个匹配的版本”.但是按Ctrl + F5可以调试运 ...

  6. iOS注册远程推送消息证书后提示此证书签发者无效的解决办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在编写关于远程推送消息的App时需要注册一个相关的证书,我 ...

  7. [Oracle] “表中有数据,但select count(*)的结果为0”问题的解决办法

    一.问题 今天遇到了一个神奇的问题--表中有数据,但select count(*)的结果为0. 这个问题最初的表现形式是"查询报表没有分页". 最开始还以为是java端的问题.后来 ...

  8. mysql建表时拆分出常用字段和不常用字段

    一对一 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然. 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名.性别.年龄.身高,体重属于常用数据,但是籍贯.住 ...

  9. hive中执行hql或建表语句时,抛出Display all 459 possibilities? (y or n)错误的解决方法

    我昨天在hive上建表,一直报Display all 459 possibilities? (y or n) ,之前我以为是建表语句有问题,一直在改语句,后来在网上搜这个错误,原来语句里混杂了Tab缩 ...

随机推荐

  1. 2015华为机试——数字基root

    题目描写叙述: 求整数的Root:给定正整数,求每位数字之和;假设和不是一位数,则反复; 输入:输入随意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行相 ...

  2. #IOS-navigation中左滑pop的三种方法

    IOS-navigation中左滑pop的三种方法 系统自带pop方法 如果我们没有对navigation中的back按钮进行自定义,我们可以直接使用系统自带的左滑pop方法.但是如果我们对back按 ...

  3. 使用js使表单自动提交

    function sub(){ document.yeepay.submit(); } setTimeout(sub,1000);//以毫秒为单位的.1000代表一秒钟.根据你需要修改这个时间. // ...

  4. 数据库导出导入操作(expdp,impdp)

    EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用. 命令行: sqlplus/nolog connect username/password as sysd ...

  5. Core Data 教学

    看了一篇国外的文章,关于iOS9的Core Data教学,在这里做了一下总结 Core Data 教学 示例开源地址:LastDayCoreData 在这篇文章中我们将学习Core Data的系列教程 ...

  6. 【转】iOS-Core-Animation-Advanced-Techniques(四)

    原文:http://www.cocoachina.com/ios/20150105/10812.html 隐式动画和显式动画 隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第 ...

  7. Objective-C中的分类与协议

    分类 在谈分类之前,我们可以先探究下,OC中为什么出现分类这种机制,有什么好处? 假设你接到一个大项目:计算两个整数的和,差.接到任务的你马上动手.编写代码如下: #import <Founda ...

  8. JavaScript Window - 浏览器对象模型

    浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话". 浏览器对象模型 (BOM) 浏览器对象模型(Browser Object Model (BOM))尚 ...

  9. photoshop中rgb与索引模式的区别

    RGB: 是色域最宽广的颜色模式它是一种光色模式不难理解  你的显示器 就是根据这个模式来显示图像的同样 我们在自然界中 看到的所有五颜六色的东西都是吸收了不同颜色的光 而得到的所以这一颜色模式 与我 ...

  10. 连接池dbcp pool

    -package cn.gdpe.pool; import java.io.InputStream;import java.sql.Connection;import java.sql.Prepare ...