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

相关推荐
星空椰3 小时前
Python 面向对象高级:继承与类定义详解
开发语言·python
白露与泡影3 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
凯瑟琳.奥古斯特3 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
雪度娃娃3 小时前
转向现代C++——在意为改写的函数添加 override
开发语言·c++
喵星人工作室4 小时前
C++火影忍者1.1.2
开发语言·c++
basketball6165 小时前
C++ 中的 ptrdiff_t 详解
开发语言·c++
月亮邮递员6165 小时前
Markdown语法总结
开发语言·前端·javascript
printfLILEI5 小时前
php中的类与对象以及反序列化
linux·开发语言·php
曹牧5 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
代码中介商5 小时前
深入解析STL中的stack、queue与priority_queue
开发语言·c++