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


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

    效果:由于是通过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中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。如下图:

    提升权限

    选择 使用其他凭据重新启动 即可。

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

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

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

     设置权限等级

     
  • 相关阅读:
    ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
    ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
    Asp.Net Core 单元测试正确姿势
    如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
    Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
    使用VS Code 开发.NET CORE 程序指南
    .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
    重新认识 async/await 语法糖
    EF添加
    EF修改部分字段
  • 原文地址:https://www.cnblogs.com/lizhenlin/p/6585976.html
Copyright © 2020-2023  润新知