C#/WPF 以管理员身份运行程序

在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以Administrator 的方式运行。

解决办法有以下几种方式:

  1. 通过 System.Diagnostics.Process.Start() 方式启动(推荐)
  2. 通过添加应用程序清单文件(过于暴力,且有提示)
  3. 直接修改程序文件的属性(不方便部署)

方法一:通过 System.Diagnostics.Process.Start() 方式启动:

WPF App.xaml代码:

复制代码
<Application x:Class="AdminLoadDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:AdminLoadDemo"
             Startup="Application_Startup">
    <Application.Resources>
         
    </Application.Resources>
</Application>

WPF App.xaml.cs代码:

复制代码
        private void Application_Startup(object sender, StartupEventArgs e)
        {
              /**
              * 当前用户是管理员的时候,直接启动应用程序
              * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
              */
             //获得当前登录的Windows用户标示
             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))
            {
                //如果是管理员,则直接运行
                new MainWindow().Show();
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                try
                {
                    System.Diagnostics.Process.Start(startInfo);
                }
                catch
                {
                    return;
                }
                //退出
                Environment.Exit(0);
            }
        }

参考:

https://www.cnblogs.com/Interkey/p/RunAsAdmin.html

相关推荐
把csdn当日记本的菜鸡2 分钟前
Java设计模式简单入门
java·开发语言·设计模式
缺点内向4 分钟前
C# 高效统计 Word 文档字数:告别手动,拥抱自动化
c#·自动化·word
宵时待雨5 分钟前
数据结构(初阶)笔记归纳6:双向链表的实现
c语言·开发语言·数据结构·笔记·算法·链表
xixi09248 分钟前
selenium——浏览器基础操作(启动/访问/窗口控制)
开发语言·python
不吃洋葱.14 分钟前
js主要内容
开发语言·javascript·ecmascript
Rhys..15 分钟前
python + selenium 如何定位动态元素
开发语言·python·selenium
源代码•宸15 分钟前
Golang原理剖析(GMP调度原理)
开发语言·经验分享·后端·面试·golang·gmp·runnext
LawrenceLan15 分钟前
Flutter 零基础入门(二十三):Icon、Image 与资源管理
开发语言·前端·flutter·dart
余衫马22 分钟前
Qt for Python:PySide6 入门指南(中篇)
开发语言·c++·python·qt
叫我辉哥e129 分钟前
新手进阶Python:办公看板集成审批流+精细化权限+日志审计
开发语言·python·信息可视化