首页 > 编程语言 >C#程序以管理员权限运行

C#程序以管理员权限运行

时间:2023-07-04 16:35:59浏览次数:45  
标签:Administrator C# WindowsPrincipal System 应用程序 管理员 权限

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

下面演示 C# 程序如何实现提示用户以管理员权限运行。

本例以WinForm程序演示,新建一项目生成后进行相应修改:

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

实现方法: 修改默认生成的Program文件,修改后的代码如下:

由于已经在代码上做了注释,所以不再详细说明;

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection.Emit;
using System.Security.Principal;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsUACRunAsAdministrator
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            //在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢?
            //下面演示 C# 程序如何实现提示用户以管理员权限运行。
            //本例以WinForm程序演示,新建一项目生成后进行相应修改:

            //方法一:通过 System.Diagnostics.Process.Start() 方式启动:
            // 获取当前的windows 用户
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //检查 获取当前的windows 用户 的 Windows 组成员身份。
            System.Security.Principal.WindowsPrincipal windowsPrincipal = new System.Security.Principal.WindowsPrincipal(identity);
            //确定当前主体是否属于具有指定 System.Security.Principal.WindowsBuiltInRole 的 Windows 用户组。
            //判断当前用户是否是管理员
            if (windowsPrincipal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            {
                MessageBox.Show($"{identity.Name}是管理员角色,管理员权限运行");
                //是管理员角色,管理员权限运行
                Application.Run(new Form1());
            }
            else
            {
                //创建启动对象
                ProcessStartInfo processStartInfo= new ProcessStartInfo();
                processStartInfo.UseShellExecute = false;
                //processStartInfo.RedirectStandardOutput = true;
                //processStartInfo.RedirectStandardError = true;
                //processStartInfo.RedirectStandardInput = true;
                processStartInfo.CreateNoWindow = true;
                processStartInfo.WorkingDirectory = Environment.CurrentDirectory;
                processStartInfo.FileName = Application.ExecutablePath;
                //设置启动动作确保 使用管理员权限运行
                processStartInfo.Verb = "runas";
                try
                {
                    Process.Start(processStartInfo);
                }
                catch (Exception)
                {
                    return;
                }
                //退出
                Application.Exit();
            }

            //方法二:通过添加应用程序清单文件:
            //在 项目 上 添加新项 选择“应用程序清单文件” 然后单击 添加 按钮
            //添加后,默认打开app.manifest文件,将:
            //< requestedExecutionLevel  level = "asInvoker" uiAccess = "false" />
            //修改为:
            //< requestedExecutionLevel level = "requireAdministrator" uiAccess = "false" />
            //然后打开 项目属性 ,将 应用程序 标签页中的 资源 中的 清单 修改为新建的 app.manifest。
            //项目属性 => 应用程序 => 资源 => 清单 => app.manifest。
            //重新生成项目,再次打开程序时就会提示 需要以管理员权限运行。
            //需要注意的是:如果在VS中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。如下图:
        }

        /// <summary>
        /// 确定当前主体是否属于具有指定 Administrator 的 Windows 用户组
        /// </summary>
        /// <returns>如果当前主体是指定的 Administrator 用户组的成员,则为 true;否则为 false。</returns>
        public static bool IsAdministrator()
        {
            bool result;
            try
            {
                WindowsIdentity identity = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                result = principal.IsInRole(WindowsBuiltInRole.Administrator);

                //http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
                //AppDomain domain = Thread.GetDomain();
                //domain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
                //WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
                //result = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
            }
            catch
            {
                result = false;
            }
            return result;
        }
    }
}

效果:由于是通过System.Diagnostics.Process.Start() 方式外部调用启动,所以直接通过VS运行时,是不会提示VS也需要管理员权限,只有程序本身需要管理员权限,与生成应用程序的程序不同。这点是和方法二实现的主要不同之处。

本文地址:http://www.cnblogs.com/Interkey/p/RunAsAdmin.html

方法二:通过添加应用程序清单文件:

在 项目 上 添加新项 选择“应用程序清单文件” 然后单击 添加 按钮

添加后,默认打开app.manifest文件,将:

<requestedExecutionLevel  level="asInvoker" uiAccess="false" />

修改为:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

然后打开 项目属性 ,将 应用程序 标签页中的 资源 中的 清单 修改为新建的 app.manifest。

重新生成项目,再次打开程序时就会提示 需要以管理员权限运行。

需要注意的是:如果在VS中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。如下图:

 

判断程序是否以管理员身份运行

 需要添加命名空间:

using System.Security.Principal;

/// <summary>
    /// 确定当前主体是否属于具有指定 Administrator 的 Windows 用户组
    /// </summary>
    /// <returns>如果当前主体是指定的 Administrator 用户组的成员,则为 true;否则为 false。</returns>
    public static bool IsAdministrator()
    {
        bool result;
        try
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            result = principal.IsInRole(WindowsBuiltInRole.Administrator);

            //http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
            //AppDomain domain = Thread.GetDomain();
            //domain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
            //WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
            //result = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
        }
        catch
        {
            result = false;
        }
        return result;
    }

方法三:直接修改程序文件的属性

右击程序文件,在弹出的属性对话框中的 兼容性 标签页中

勾选“以管理员身份运行此程序”即可。

 

 

如果有兴趣还可以继续查看下面的链接:

http://www.cnblogs.com/Lemon_s/archive/2011/07/28/2119222.html

http://www.cnblogs.com/shenchao/archive/2013/03/05/2944660.html

标签:Administrator,C#,WindowsPrincipal,System,应用程序,管理员,权限
From: https://www.cnblogs.com/1175429393wljblog/p/17526094.html

相关文章

  • Camstar SSL需要证书下载才能导入excel
    谷歌浏览器F12,点击security,点击ViewCertificate.  下载好了,双击,进行安装 设置:注册表 ......
  • ORACLE游标使用
    显示使用游标(并定义返回记录类型)DECLARETYPEdetail_recordISRECORD(ENCOUNTERIDPRPA.ENCOUNTER.ENCOUNTERID%type,SICKBEDIDPRPA.ENCOUNTER.SICKBEDID%type,DISPLAYNAMEPRPA.ENCOUNTER.DISPLAYNAME%type,BIRTHTIMEPRPA.ENCOUNT......
  • MacBook能连上Wi-Fi,浏览器连接不上网站的解决方法
    MacBook连接上Wi-Fi后,可以使用微信等软件,却无法打开网页,解决办法是1.点击左上方苹果图标>>>系统设置>>>网络>>>点击详细信息点击DNS>>>将DNS服务器进行修改>>>+-号是增加或删除>>>然后就能正常使用浏览器 部分DNS ......
  • 【FPGA基础】COE文件与MIF文件使用方法
    在FPGA开发中,COE文件和MIF文件是常用的存储器初始化文件。COE文件和MIF文件都用于导入存储器ROM或RAM的存储数据,但是它们的格式和语法有些不同。其中COE文件主要用于Vivado,MIF文件主要用于AlteraQuartus软件。本文主要介绍COE文件和MIF文件的使用方法。一、COE文件COE文件是一......
  • centos8环境基本优化
    centos8环境基本优化目录centos8环境基本优化1.防火墙优化2.源优化:方案1.更换阿里源方案2.使用centos8.5源安装epel源3.ssh连接慢解决4.关闭公网,只开放内网(可选)5.配置定时任务,时间同步centos7ntpdcentos86.PS17.配置sudo1.防火墙优化参考链接https://www.cnblogs.com/ztton......
  • vscode python开发环境搭建
    vscode是微软开发的轻量级ide软件,有大量的插件,很适合python开发。以下简述vscode的python开发环境搭建步骤:一、官网下载vscode软件基于安全考虑软件下载最好到官网下载。vscode官网地址:https://code.visualstudio.com/download,到2023年7月4日最新版本为:VSCodeUserSetup-x64-1.......
  • python基础day37 基于TCP、UDP协议的套接字编程和粘包现象
    基于TCP协议的套接字编程(socket编程)什么是Socket?我们经常把Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCO/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信  套接字的分类:AF_UNIX:用在局域网中AF_INET:用在互联网中客户......
  • leetcode 22. 括号生成
    暴力枚举classSolution{publicList<String>generateParenthesis(intn){List<String>list=getAll(2*n);List<String>result=newArrayList<>();for(Stringitem:list){intvalue=0;......
  • geoserver(内置GeoWebcache)+arcgis瓦片(完整)
    环境:geoserver-2.18.0-bin、geowebcache-1.18.3-war里的gwc-arcgiscache-1.18-SNAPSHOT.jargeoserver下载地址:https://sourceforge.net/projects/geoserver/files/latest/downloadGeoWebcache:https://sourceforge.net/projects/geowebcache/files/geowebcache/1.18.3/geowebcache......
  • Jetpack Compose:开始使用组件
    接上篇https://www.cnblogs.com/develon/p/17417599.htmlTabRowimportandroidx.compose.foundation.layout.Columnimportandroidx.compose.foundation.layout.Spacerimportandroidx.compose.foundation.layout.heightimportandroidx.compose.material3.Tabimportandr......