架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 40510|回复: 3

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

[复制链接]
发表于 2016-10-9 09:14:38 | 显示全部楼层 |阅读模式
在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢?
下面演示 C# 程序如何实现提示用户以管理员权限运行。
本例以WinForm程序演示,新建一项目生成后进行相应修改:
方法一:通过 System.Diagnostics.Process.Start() 方式启动:
实现方法: 修改默认生成的Program文件,修改后的代码如下:
由于已经在代码上做了注释,所以不再详细说明;
  1. static class Program
  2.     {
  3.         [STAThread]
  4.         static void Main()
  5.         {            
  6.             Application.EnableVisualStyles();
  7.             Application.SetCompatibleTextRenderingDefault(false);

  8.             /**
  9.              * 当前用户是管理员的时候,直接启动应用程序
  10.              * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
  11.              */
  12.             //获得当前登录的Windows用户标示
  13.             System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
  14.             System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
  15.             //判断当前登录用户是否为管理员
  16.             if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
  17.             {
  18.                 //如果是管理员,则直接运行
  19.                 Application.Run(new Form1());
  20.             }
  21.             else
  22.             {
  23.                 //创建启动对象
  24.                 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
  25.                 startInfo.UseShellExecute = true;
  26.                 startInfo.WorkingDirectory = Environment.CurrentDirectory;
  27.                 startInfo.FileName = Application.ExecutablePath;
  28.                 //设置启动动作,确保以管理员身份运行
  29.                 startInfo.Verb = "runas";
  30.                 try
  31.                 {
  32.                     System.Diagnostics.Process.Start(startInfo);
  33.                 }
  34.                 catch
  35.                 {
  36.                     return;
  37.                 }
  38.                 //退出
  39.                 Application.Exit();
  40.             }
  41.         }
  42.     }
复制代码

效果:由于是通过System.Diagnostics.Process.Start() 方式外部调用启动,所以直接通过VS运行时,是不会提示VS也需要管理员权限,只有程序本身需要管理员权限,与生成应用程序的程序不同。这点是和方法二实现的主要不同之处。
方法二:通过添加应用程序清单文件:
在 项目 上 添加新项 选择“应用程序清单文件” 然后单击 添加 按钮
添加后,默认打开app.manifest文件,将:
修改为:
然后打开 项目属性 ,将 应用程序 标签页中的 资源 中的 清单 修改为新建的 app.manifest。
重新生成项目,再次打开程序时就会提示 需要以管理员权限运行。
需要注意的是:如果在VS中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。如下图:
o_04.png
选择 使用其他凭据重新启动 即可。
方法三:直接修改程序文件的属性
右击程序文件,在弹出的属性对话框中的 兼容性 标签页中
勾选“以管理员身份运行此程序”即可。
o_05.png







上一篇:{"Element '_id' does not match any field or property of class."}
下一篇:.net/c# 实现mongodb查询和模糊查询4种方式[附源码]
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2016-10-9 09:15:27 | 显示全部楼层
判断程序是否以管理员身份运行
需要添加命名空间:
using System.Security.Principal;
  1. /// <summary>
  2.     /// 确定当前主体是否属于具有指定 Administrator 的 Windows 用户组
  3.     /// </summary>
  4.     /// <returns>如果当前主体是指定的 Administrator 用户组的成员,则为 true;否则为 false。</returns>
  5.     public static bool IsAdministrator()
  6.     {
  7.         bool result;
  8.         try
  9.         {
  10.             WindowsIdentity identity = WindowsIdentity.GetCurrent();
  11.             WindowsPrincipal principal = new WindowsPrincipal(identity);
  12.             result = principal.IsInRole(WindowsBuiltInRole.Administrator);

  13.             //http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
  14.             //AppDomain domain = Thread.GetDomain();
  15.             //domain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
  16.             //WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
  17.             //result = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
  18.         }
  19.         catch
  20.         {
  21.             result = false;
  22.         }
  23.         return result;
  24.     }
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-1-26 09:59:52 | 显示全部楼层
c#判断程序是否是以管理员身份运行
https://www.itsvse.com/thread-3004-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2025-10-13 09:18:33 | 显示全部楼层
.NET Core 应用在 windows  系统以管理员身份运行,代码如下:


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-10-20 18:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表