C#项目中引入app.manifest管理员权限运行

贵有恒,何必三更起、五更眠、最无益,只怕一日曝、十日寒。这篇文章主要讲述C#项目中引入app.manifest管理员权限运行相关的知识,希望能为你提供帮助。
原文地址:https://blog.csdn.net/qq395537505/article/details/51010962
参考UAC:User Account Control
参考IE保护模式:https://blog.csdn.net/xt_xiaotian/article/details/5336809
打开VS2005、VS2008、VS2010、VS2012、VS2013、VS2015工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件;如没有,按如下方式创建:鼠标右击工程在菜单中选择“ 属性” ,点击工程属性的“ 安全性” 标签,在安全性标签页中勾选“ 启用ClickOnce安全设置” ,并选择“ 这是完全可信的应用程序” ,保存工程,此时在Properties下已经自动生成了app.manifest文件。
将默认的app.manifest文件修改为
[html] view plain copy

  1. < ?xml  version="1.0"  encoding="utf-8"?>    
  2. < asmv1:assembly  manifestVersion="1.0"  xmlns="urn:schemas-microsoft-com:asm.v1"  xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"  xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">    
  3.     < assemblyIdentity  version="1.0.0.0"  name="MyApplication.app"/>    
  4.     < trustInfo  xmlns="urn:schemas-microsoft-com:asm.v2">    
  5.         < security>    
  6.             < requestedPrivileges  xmlns="urn:schemas-microsoft-com:asm.v3">    
  7.                 < !--  UAC  清单选项   
  8.                         如果要更改  Windows  用户帐户控制级别,请用以下节点之一替换     
  9.                         requestedExecutionLevel  节点。   
  10.    
  11.                 < requestedExecutionLevel    level="asInvoker"  uiAccess="false"  />    
  12.                 < requestedExecutionLevel    level="requireAdministrator"  uiAccess="false"  />    
  13.                 < requestedExecutionLevel    level="highestAvailable"  uiAccess="false"  />    
  14.    
  15.                         指定  requestedExecutionLevel  节点将会禁用文件和注册表虚拟化。   
  16.                         如果要利用文件和注册表虚拟化实现向后     
  17.                         兼容性,则删除  requestedExecutionLevel  节点。   
  18.                 -->    
  19.                 < requestedExecutionLevel  level="requireAdministrator"  uiAccess="false"  />    
  20.             < /requestedPrivileges>    
  21.         < /security>    
  22.     < /trustInfo>    
  23.    
  24.     < compatibility  xmlns="urn:schemas-microsoft-com:compatibility.v1">    
  25.         < application>    
  26.             < !--  此应用程序设计使用的所有  Windows  版本的列表。Windows  将会自动选择最兼容的环境。-->    
  27.    
  28.             < !--  如果应用程序设计使用  Windows  7,请取消注释以下  supportedOS  节点-->    
  29.             < !--< supportedOS  Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> -->    
  30.    
  31.         < /application>    
  32.     < /compatibility>    
  33.    
  34.     < !--  启用  Windows  公共控件和对话框的主题(Windows  XP  和更高版本)  -->    
  35.     < !--  < dependency>    
  36.         < dependentAssembly>    
  37.             < assemblyIdentity   
  38.                     type="win32"   
  39.                     name="Microsoft.Windows.Common-Controls"   
  40.                     version="6.0.0.0"   
  41.                     processorArchitecture="*"   
  42.                     publicKeyToken="6595b64144ccf1df"   
  43.                     language="*"   
  44.                 />    
  45.         < /dependentAssembly>    
  46.     < /dependency> -->    
  47.    
  48. < /asmv1:assembly>    
修改< requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 节点即可。
【C#项目中引入app.manifest管理员权限运行】配置文件修改后,我们运行应用程序,就会首先弹出这样一个提示框,点 Yes 后,程序才可以继续运行。
顺便说下,还可以通过一个方法了解到此时程序运行是不是管理员权限:
[csharp] view plain copy
  1. public  bool  IsAdministrator()   
  2. {   
  3.           WindowsIdentity  identity  =  WindowsIdentity.GetCurrent();    
  4.           WindowsPrincipal  principal  =  new  WindowsPrincipal(identity);    
  5.           return  principal.IsInRole(WindowsBuiltInRole.Administrator);    
  6. }   
 
对于XML文件中引用的UAC执行权限级别,分别代表下列含义:
                asInvoker : 应用程序就是以当前的权限运行。
                highestAvailable: 这个是以当前用户可以获得的最高权限运行。
                requireAdministrator: 这个是仅以系统管理员权限运行。
                默认情况下是 asInvoker。
                highestAvailable 和 requireAdministrator 这两个选项都可以提示用户获取系统管理员权限。那么这两个选项的区别在哪里呢?
                他们的区别在于,如果我们不是以管理员帐号登录,那么如果应用程序设置为 requireAdministrator ,那么应用程序就直接运行失败,无法启动。而如果设置为 highestAvailable,则应用程序可以运行成功,但是是以当前帐号的权限运行而不是系统管理员权限运行。如果我们希望程序在非管理员帐号登录时也可以运行(这种情况下应该某些功能受限制) ,那么建议采用 highestAvailable 来配置。

    推荐阅读