CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
随笔 - 135, 文章 - 0, 评论 - 547, 阅读 - 51万
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

Posted on   Charles Chen  阅读(718)  评论(0编辑  收藏  举报

      本文转载:http://www.cnblogs.com/Interkey/p/RunAsAdmin.html

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

   

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

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

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

    

复制代码
 1 static class Program
 2     {
 3         /// <summary>
 4         /// 应用程序的主入口点。
 5         /// </summary>
 6         [STAThread]
 7         static void Main(string[] Args)
 8         {
 9             Application.EnableVisualStyles();
10             Application.SetCompatibleTextRenderingDefault(false);
11             System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
12             System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
13             bool createNew;
14             //通过Mutex对象判断程序是否已经启动
15             using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
16             {
17                 if (createNew)
18                 {
19                     if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
20                     {
21                         //如果是管理员,则直接运行   
22                         //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
23                         //Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
24                         Application.Run(new MainForm());
25                     }
26                     else
27                     {
28                         //创建启动对象   
29                         System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
30                         
31                         //设置运行文件   
32                         startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
33                         //设置启动参数   
34                         startInfo.Arguments = String.Join(" ", Args);
35                         //设置启动动作,确保以管理员身份运行   
36                         startInfo.Verb = "runas";
37                         //如果不是管理员,则启动UAC   
38                         System.Diagnostics.Process.Start(startInfo);
39                         //退出   
40                         System.Windows.Forms.Application.Exit();
41                     }
42                 }
43                 else
44                 {
45                     MessageBox.Show("程序已经在运行中...", "提示", MessageBoxButtons.OK,
46                          MessageBoxIcon.Asterisk);
47                     System.Threading.Thread.Sleep(1000);
48                     System.Environment.Exit(1);
49                 }
50             }
51         }
52     }
复制代码

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

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

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

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

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

修改为:

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

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

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

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

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

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

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

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2010-05-23 C# 类型基础(zt)
2008-05-23 移动项目开发笔记(UML概览读书笔记)
点击右上角即可分享
微信分享提示