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

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 06:10:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 06:10:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 06:10:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 06:10:02       18 阅读

热门阅读

  1. c++ - 函数的模板特化

    2023-12-29 06:10:02       43 阅读
  2. 不浪费原料的汉堡制作方案(LeetCode日记)

    2023-12-29 06:10:02       33 阅读
  3. Leetcode-230.二叉搜索树中第k小的元素(Python)

    2023-12-29 06:10:02       40 阅读
  4. Zeppelin安装教程

    2023-12-29 06:10:02       33 阅读
  5. 使用pandas绘图,并保存,支持中文

    2023-12-29 06:10:02       30 阅读
  6. 07.kubernetes客户端部署

    2023-12-29 06:10:02       38 阅读
  7. oracle linux 8升级gcc gcc9

    2023-12-29 06:10:02       39 阅读