设为首页 收藏本站
查看: 747|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-11 12:10:19 | 显示全部楼层 |阅读模式
  项目 - 属性 - 安全性,“使用ClickOnce”,修改app.mainfest,再取消“使用ClickOnce”
  


  【另有一篇参考文章:http://blog.iyunv.com/wonsoft/article/details/6598407】
  
  在XP/2003下调试得好好的程序,到了windows7下,却抛出“不允许所请求的注册表访问权”的异常,该异常就在读写注册表时引发,例:







view
plain


  • public class Program  

  •     {  

  •         public static void SetAutoRun(string keyName, string filePath)  

  •         {  

  •             using (RegistryKey runKey = Registry.LocalMachine.OpenSubKey(@"software\microsoft\windows\currentversion\run", true))  

  •             {  

  •                 runKey.SetValue(keyName, filePath);  

  •                 runKey.Close();  

  •             }  

  •         }  

  •   

  •         static void Main()  

  •         {  

  •             string keyName = "TestAutoRun";  

  •             string fliePath = @"D:\CSharpProject\CSharp_Learn\MyDelegate.exe";  

  •             SetAutoRun(keyName, fliePath);  

  •         }  

  •     }  

  • }  
  该程序如在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")]
  
  【方法二】
  添加 应用程序清单文件,在其中加入







view
plain


  •   

  •         

  •          

  •          

  •         

  •       
  
  修改代码,如下:







view
plain


  • System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();  

  • System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal( identity );  

  • if(principal.IsInRole( System.Security.Principal.WindowsBuiltInRole.Administrator ))  

  • {  

  •     // 修改注册表  

  • }  

  • else  

  • {  

  •        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();  

  •        startInfo.FileName = System.Windows.Forms.Application.ExecutablePath; // 获取当前可执行文件的路径及文件名   

  •         //以下 Args 为启动本程序的对应的参数  

  •         startInfo.Arguments = String.Join( " ", Args );  

  •        startInfo.Verb = "runas";  

  •        System.Diagnostics.Process.Start( startInfo );  

  • }  
  


问题描述:

为了实现程序的自动启动,我们会再注册表中写入相关信息,实现代码如下:

RegistryKey HKLM = Registry.LocalMachine;

RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");




DSC0000.jpg



但总提示如上图的错误,困扰了我很久。编译后的的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的文件,输入以下代码即可:
  



 
   
  Description of your application 
  
  
    
      
        
        
       
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65825-1-1.html 上篇帖子: Windows Phone开发经验谈(7)-手势切换的方式(上) 下篇帖子: windows 7下安装MySQL5.6
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表