【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法
来源:互联网 发布:漂亮的谐音网络用语 编辑:程序博客网 时间:2024/05/22 00:20
在XP/2003下调试得好好的程序,到了windows7下,却抛出“不允许所请求的注册表访问权”的异常,该异常就在读写注册表时引发,例:
- public class Program
- {
- public staticvoid 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")]
【方法二】
添加 应用程序清单文件,在其中加入
- <security>
- <requestedPrivilegesxmlns="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 节点。
- -->
- <requestedExecutionLevellevel="requireAdministrator"uiAccess="false"/>
- </requestedPrivileges>
- </security>
修改代码,如下:
- 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 );
- }
- 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法
- 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法
- 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法
- winform 创建新注册表时出现“不允许所请求的注册表访问权”,解决办法
- 不允许所请求的注册表访问权
- 不允许所请求的注册表访问权
- C# 多用户操作不允许所请求的注册表访问权
- C#注册表访问程序Win7系统下报错 “不允许所请求的注册表访问权”(图文)
- System.Security.SecurityException: 不允许所请求的注册表访问权
- System.Security.SecurityException: 不允许所请求的注册表访问权。
- 关于ASP.NET 不允许所请求的注册表访问权。
- 不允许所请求的注册表访问权。 (mscorlib)
- c#securityexception不允许所请求的注册表访问权
- System.Security.SecurityException: 不允许所请求的注册表访问权 一个简单的解决办法
- 企业库使用异常不允许所请求的注册表访问权 解决办法
- C#项目图文说明 不允许所请求的注册表访问权 异常的一种解决方式
- 使用Enterprise Library时: 不允许所请求的注册表访问权的解决
- 使用Enterprise Library时出现“System.Security.SecurityException: 不允许所请求的注册表访问权”错误
- ME 类的自我引用(SELF-REFERENCE) - 理解
- 基于UINavigationController+TabBarController的无xib工程框架
- 数据导出到Excel(或Word)源代码大全
- C++词法分析(C#描述)
- 流年,经不起怀念
- 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法
- 关于大小端存储方式问题的思考
- mtk android sd卡调试
- 文件读
- tfs2010学习
- ——序言
- TinyXML:一个优秀的C++ XML解析器
- 尕福(散文)
- 【java学习】java与C++的简单比较