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

相关推荐
我是坏垠7 小时前
Crypto、Cipher与Password:Java加密开发的三个核心概念
java·开发语言·python
white_ant7 小时前
JDK LTS 版本升级迁移注意事项大全
java·开发语言
Bobolink_8 小时前
跨境业务网络环境评估,“干净、一致、独享”三个关键指标
开发语言·网络·php·跨境网络·网络环境
你怎么知道我是队长8 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
xingke8 小时前
C 语言多文件编程:(一)头文件、extern、编译链接
c语言·开发语言·多文件
戮漠summer9 小时前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
jinyishu_9 小时前
C++ string使用方法
开发语言·c++
EW Frontier9 小时前
三级跳突破864维动作空间——QMIX-Hierarchical多无人机协同通信方法全解析【附python代码】
开发语言·python·无人机·强化学习·通信资源分配
名字还没想好☜9 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
乐观勇敢坚强的老彭9 小时前
C++浮点数使用注意事项
开发语言·c++