某次需要使用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是表示等待相关联进程的。如果不加入参数,则会表示软件主进程会无限期等待关联进程,也就是要求用户提升系统权限的弹出框。只有用户进行操作之后才会继续向下执行。

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

最新文章

  1. KPI
  2. Qt Creator调试
  3. java.lang.OutOfMemoryError: unable to create new native thread如何解决
  4. 关于document.write
  5. Android 调用系统的邮箱app发送邮件
  6. [转载]MongoDB的$inc修改器
  7. Floyd算法应用-医院选址问题
  8. php set env
  9. MYSQL group_concat() 函数
  10. Delphi 中 FindWindow 和 FindWindowEx 找到外部进程,然后发送消息(比如最大化)
  11. 通信网Project之——单源单宿最短路问题
  12. Spring3.2不支持jdk8
  13. 《天书夜读:从汇编语言到windows内核编程》七 内核字符串与内存
  14. GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen
  15. Java的SSH框架整合
  16. Codeforces 1082C Multi-Subject Competition(前缀+思维)
  17. Codeforces Round #418 (Div. 2)
  18. IDEA下载依赖时提示 resolving dependencies of xxx, yyy
  19. org.springframework.web.util.Log4jWebConfigurer
  20. VC工程从Win32环境往Win64环境迁移的经验总结

热门文章

  1. 系统管理命令之w
  2. Java 泛型通配符上限和通配符下限
  3. Ubuntu下常用强化学习实验环境搭建(MuJoCo, OpenAI Gym, rllab, DeepMind Lab, TORCS, PySC2)
  4. Cooperation.GTST团队项目总结
  5. 关于LIS和LCS问题的o(nlogn)解法
  6. 解决 "OperationalError: (sqlite3.OperationalError) no such table: ..."问题
  7. hdu 5701 中位数计数 思路题
  8. 【Jmeter】 Report Dashboard 生成html图形测试报告
  9. 浅谈Android Studio3.0更新之路(遇坑必入)
  10. Java中处理异常的9个最佳实践