某次需要使用C#对注册表进行操作,不过却发现没有权限,研究了以下发现是当前系统用户的问题。除非当前系统用户是Administrator,否则就会给你抛出一个异常。后来在网上发现了一个方法,原来C#也可以获取用户的系统管理员权限的,虽然需要用户进行确认。

这里我对Oracle软件的一个键进行了操作,想要将值改为一个指定的字符。在进入注册表后,进行提升权限操作,获取权限后执行bat文件和reg文件。当然,如果不想用bat和reg文件也可以,不过那就需要在操作注册表之前进行提升权限操作了。

            try
{
//操作注册表进入指定键值对
Microsoft.Win32.RegistryKey RegistryRoot = Microsoft.Win32.Registry.LocalMachine;
string[] path = new string[] { "SOFTWARE", "ORACLE", "KEY_OraDb10g_home1" };
foreach (string p in path)
{
if (RegistryRoot != null)
RegistryRoot = RegistryRoot.OpenSubKey(p);
}
//判断键值对是否为空
if (RegistryRoot != null)
{
object value = RegistryRoot.GetValue("NLS_LANG");
//如果键值不符合标准,则修改注册表键值对
if (value == null || !value.ToString().ToUpper().Contains("ZHS16GBK"))
{
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))
{
//如果是管理员,则直接运行
System.Diagnostics.Process.Start("regedit.exe", "/s oracle_char.reg");
}
else
{
//创建启动对象
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
//startInfo.FileName = Application.ExecutablePath;
startInfo.FileName = string.Format("{0}oracle_char.bat", AppDomain.CurrentDomain.BaseDirectory);
//设置启动动作,确保以管理员身份运行
startInfo.Verb = "runas";
System.Diagnostics.Process.Start(startInfo);
}
}
}
}
catch
{ }

bat文件:

@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
cd /d "%~dp0"
@FOR %%A IN (oracle_char.reg) DO (REGEDIT /S %%A)

reg文件:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1]
"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

在运行提升权限操作时,程序会弹出一个窗口,要求用户提升权限。Adminsitrator用户有密码的话输入密码,没有密码点击一下确认按钮就可以了。

不过这个时候可能会出现一个问题,就是在弹出要求用户提升系统权限的时候,主进程的代码会继续向下执行,这个时候,就需要调用下面的一个方法。

System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo);
process.WaitForExit();

方法WaitForExit是表示等待相关联进程的。如果不加入参数,则会表示软件主进程会无限期等待关联进程,也就是要求用户提升系统权限的弹出框。只有用户进行操作之后才会继续向下执行。

不过值得注意的是,如果这个时候用户点击按钮“否”的话,会抛出一个异常,叫做“用户取消操作”。

C#修改注册表的更多相关文章

  1. 修改注册表 去除Windows快捷方式图标小箭头

    一些朋友不喜欢Windows系统中快捷方式图标上面的小箭头,下面介绍如何修改注册表去除快捷方式图标上的小箭头. 1.开始->运行->输入regedit,启动注册表编辑器,然后; 2.依次展 ...

  2. C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  3. windows文件关联、打开方式列表之修改注册表攻略

    这里全是修改注册表的方式.网上找了半天,有的仅有添加文件关联的方法,却没有添加到打开方式列表里面的方法:有的有添加到文件列表的方法,却是使 用控制面板->文件夹选项的.好难得才找齐所有,从添加文 ...

  4. 通过cmd修改注册表并设置cmd窗口的大小

    设置cmd的窗口 mode: modem设置系统设备,主要是lpt1, com1/2, con: 启动时设置窗口大小: cmd /k "mode con: cols=120 lines=40 ...

  5. 【转】C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  6. 通过修改注册表来破解sqlyog

    Sqlyog作为一款可视化的数据库管理工具,各种方便我就不说了,但是未经汉化或者绿色过的软件存在30天的生命期,到期后我们就不可以使用了,要摸卸载重装,我们还可以去修改注册表,来延长它的生命期,具体步 ...

  7. C# .NET修改注册表

    c#修改注册表,需要引用Microsoft.Win32命名空间 using Microsoft.Win32; //声明 ///引用 RegistryKey reg; reg = Registry.Cl ...

  8. 通过修改注册表设置windows环境变量

    开发环境搭建每次都要设置很多环境变量, 一般是通过  [菜单]->[计算机]->[属性]->[高级设置]->[环境变量]进行设置,重装系统后,每次都要设置很多环境变量,很麻烦. ...

  9. 修改注册表信息来兼容当前WebBrower程序

    public class WebBrower { /// <summary> /// 修改注册表信息来兼容当前程序 /// /// </summary> public stat ...

  10. Win10 远程桌面连接出现“要求的函数不受支持”的解决办法之修改注册表

    问题起因 笔者自己在阿里云上搞服务器,有一台 Windows Server 必须通过远程桌面连接来管理,由于没能完全关掉 Win10 自带的烦人的系统更新,导致昨天安装完更新后出现了连接远程桌面时“要 ...

随机推荐

  1. 搭建Mybatis 出现 Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mapper.BatchCustomer.findBatchCustomerOneToOne

    Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection doe ...

  2. python webdriver api-操作富文本框

    操作富文本框-就是邮件正文部分,可以选字体啥的 第一种方式: 一般都是在iframe里,要切进去,一般是”html/body”,编辑之后,再切出来,然后再send_keys就完事儿 #encoding ...

  3. js 变量、函数提升 与js的预编译有关

    参考网址:http://www.codesec.net/view/178491.html 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = ...

  4. 20145221 《Java程序设计》第九周学习总结

    20145221 <Java程序设计>第九周学习总结 教材学习内容总结 整合数据库 JDBC入门 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行 ...

  5. 简单方法实现无刷新提交Form表单

    前几天遇到一个前端的问题.我希望提交表单后页面不跳转且不刷新当前页面,然而查了很多方法都没有解决. 由于Form 是提交后一定刷新页面的,所以我们可以用一个折中的办法.我们给Form 指定一个ifra ...

  6. Redis之数据备份与恢复

    Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 re ...

  7. 科幻小说《霜与火》 by 雷·布雷德伯里

    漫漫长夜中,西姆出世了,躺在山洞冰凉的石头上,嗷嗷大哭,浑身血液奔流,脉搏每分钟一千跳.他不停地长大.妈妈用发烫的双手喂西姆吃东西.人生的梦魔开场了.一来到世间,他的眼睛就闪烁着警觉的光芒:而后又令人 ...

  8. codeforces 9 div2 C.Hexadecimal's Numbers 暴力打表

    C. Hexadecimal's Numbers time limit per test 1 second memory limit per test 64 megabytes input stand ...

  9. JavaScript权威指南--正则表达式

    知识要点 正则表达式,是一个描述字符模式的对象.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能. ...

  10. npm安装vue详细教程(图片详解)

    npm安装vue详细教程(图片详解) 一.总结 一句话总结:整个安装流程照着教程来,注意系统环境变量的配置,注意一下npm的本地仓库和缓存位置 教程 系统环境变量 仓库 缓存 1.什么情况下最适合用n ...