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

相关推荐
意法半导体STM3219 小时前
【官方原创】STM32H7双核芯片通过 STlink连接失败问题分析 LAT1654
开发语言·前端·javascript·stm32·单片机·嵌入式硬件
深蓝海拓19 小时前
使用@property将类方法包装为属性
开发语言·python
xiaoye-duck19 小时前
【C++:unordered_set和unordered_map】 深度解析:使用、差异、性能与场景选择
开发语言·c++·stl
zjjsctcdl19 小时前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
格林威19 小时前
Baumer相机锂电池极片裁切毛刺检测:防止内部短路的 5 个核心方法,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·视觉检测
顶点多余19 小时前
线程互斥+线程同步+生产消费模型
java·linux·开发语言·c++
Albert Edison19 小时前
【ProtoBuf 语法详解】更新消息|保留字段|未知字段
开发语言·c++·protobuf
feifeigo12319 小时前
近场声全息(NAH)数据与MATLAB实现
开发语言·matlab
fie888920 小时前
基于MATLAB的非线性模型预测控制(NMPC)在CSRT系统中的应用
开发语言·matlab
⑩-20 小时前
Java基础+集合框架-八股文
java·开发语言