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

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

 
我们在 win7 下运行一些安装程序时,会发现首先弹出一个对话框,让用户确认是否同意允许这个程序改变你的计算机配置,但我们编写的应用程序默认是不会弹出这个提示的,也无法以管理员权限运行。本文介绍了 C# 程序如何设置来提示用户以管理员权限运行。
首先在项目中增加一个 Application Manifest File
 

 
 
默认的配置如下:
 
<?xml version="1.0" encoding="utf-8"?>
<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">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.

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

If you want to utilize File and Registry Virtualization for backward
compatibility then delete the requestedExecutionLevel node.
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>

  我们可以看到这个配置中有一个 requestedExecutionLevel 项,这个项用于配置当前应用请求的执行权限级别。这个项有3个值可供选择,如下表所示:

Value Description Comment
asInvoker The application runs with the same access token as the parent process. Recommended for standard user applications. Do refractoring with internal elevation points, as per the guidance provided earlier in this document.
highestAvailable The application runs with the highest privileges the current user can obtain. Recommended for mixed-mode applications. Plan to refractor the application in a future release.
requireAdministrator The application runs only for administrators and requires that the application be launched with the full access token of an administrator. Recommended for administrator only applications. Internal elevation points are not needed. The application is already running elevated.

  asInvoker : 如果选这个,应用程序就是以当前的权限运行。

  highestAvailable: 这个是以当前用户可以获得的最高权限运行。

  requireAdministrator: 这个是仅以系统管理员权限运行。

  默认情况下是 asInvoker。

  highestAvailable 和 requireAdministrator 这两个选项都可以提示用户获取系统管理员权限。那么这两个选项的区别在哪里呢?

  他们的区别在于,如果我们不是以管理员帐号登录,那么如果应用程序设置为 requireAdministrator ,那么应用程序就直接运行失败,无法启动。而如果设置为 highestAvailable,则应用程序可以运行成功,但是是以当前帐号的权限运行而不是系统管理员权限运行。如果我们希望程序在非管理员帐号登录时也可以运行(这种情况下应该某些功能受限制) ,那么建议采用 highestAvailable 来配置。

  关于requestedExecutionLevel 设置的权威文档请参考下面链接:

  Create and Embed an Application Manifest (UAC)

下面是修改后的配置文件:
 

<?xml version="1.0" encoding="utf-8"?>
<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">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the 
requestedExecutionLevel node with one of the following.

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

If you want to utilize File and Registry Virtualization for backward 
compatibility then delete the requestedExecutionLevel node.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
 

配置文件修改后,我们运行应用程序,就会首先弹出这样一个提示框,点 Yes 后,程序才可以继续运行,并且获得系统管理员的权限。

 

 
 
下面再来看看程序如何知道当前运行在系统管理员权限还是非系统管理员权限:
using System.Security.Principal
 

public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
 

这段代码可以用于判断当前程序是否运行在系统管理员权限下。如果配置为 asInvoker,在win7 下,这个函数会返回 false ,如果是 requireAdministrator 则返回 true。

时间: 2024-11-30 14:54:55

C# WinForm判断程序是否以管理员身份运行的相关文章

Win7下如何让程序始终以管理员身份运行

在Win7中,有些程序必须"以管理员身份运行"才能正常使用,一般情况下,在开启这类程序时,用鼠标右键点击程序图标,然后选择"以管理员身份运行"就可以了.虽然操作简单,但Win7中的程序那么多,难免有时会忘记.那么,如何能让程序在Win7下始终以管理员身份运行呢?方法其实很简单. 首先,同样用鼠标右键点击程序图标,然后选择"属性". 打开程序属性 切换到"兼容性"选项卡,勾选最下方的"以管理员身份运行".  

win8 怎么设置所有程序默认以管理员身份运行

问题描述 win8 怎么设置所有程序默认以管理员身份运行 win8 怎么设置所有程序默认以管理员身份运行,求大神指教.已经是用的administrator账户登录的 但是默认还不是以管理员身份运行 解决方案 你关闭UAC的话,用Admin帐户登陆后,所有程序都是Administrator权限了 解决方案二: 没有用户账户控制(家长控制)吗? 解决方案三: 必须禁用UAC才可以. http://jingyan.baidu.com/article/c275f6bae2650ce33d756795.h

win7下让程序默认以管理员身份运行

在win7中用自己写的程序读取MBR时,突然提示无法对磁盘进行操作,而在xp下并没有这个问题:最后点右键以管理员身份运行才可以正常运行.于是想办法让程序在双击启动时默认以管理员身份运行.具体方法: 1.首先创建一个名为manifest的文件并将下面的内容粘贴进去: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:sc

C#默认以管理员身份运行程序实现代码

 权限不够,导致无法修改系统时间,于是我以管理员身份运行了一次,结果测试成功,下面为大家介绍下C#如何默认以管理员身份运行程序 上篇博客写了一下如何通过网络时间更新系统时间,当时写的时候怎么测试都不成功,后来想想是不是我操作系统(当时是在win8上开发的)的问题.当时我猜应该是权限不够,导致无法修改系统时间,于是我以管理员身份运行了一次,结果测试成功!原来真的是权限的问题,于是就在程序里面加入了默认以管理员身份运行的代码.下面让我们看看是怎么实现的吧!    程序默认以管理员身份运行  代码如下

C#默认以管理员身份运行程序实现代码_实用技巧

上篇博客写了一下如何通过网络时间更新系统时间,当时写的时候怎么测试都不成功,后来想想是不是我操作系统(当时是在win8上开发的)的问题.当时我猜应该是权限不够,导致无法修改系统时间,于是我以管理员身份运行了一次,结果测试成功!原来真的是权限的问题,于是就在程序里面加入了默认以管理员身份运行的代码.下面让我们看看是怎么实现的吧! 程序默认以管理员身份运行 复制代码 代码如下: static void Main(string[] Args) { /** * 当前用户是管理员的时候,直接启动应用程序

Win7系统如何以管理员身份运行程序

  大家看Win7系统教程的时候经常会看见"以管理员身份运行",那么怎样才能以管理员身份运行运行Win7系统程序呢?下面系小编为大家介绍一下. 1.通常,我们一般采用直接在目标程序上点击鼠标右键打开菜单选择"以管理员身份运行"; 2.或者我们按下快捷键Ctrl+Shift,在用鼠标左键正常打开程序,也会是"以管理员身份运行"的效果; 那么,我们是否可以设置程序"默认以管理员身份运行"呢? 方法一:在程序本身设置 1.在程序上右

win7以管理员身份运行设置图解

在win7系统中增加了"以管理员身份运行"这个功能.原因是:为了系统安全,很多程序不让以administrator账户运行的,但这个又导致很多程序因为无法获得相关权限而无法运行,于是就出现了所谓的"兼容性问题",一般右键以管理员身份运行后,本来不能运行的程序就能运行了. 在 Windows 7 中,若要以管理员身份运行程序,通常会使用以下两种方法: 在程序或其快捷方式上右键鼠标,选择"以管理员身份运行". 使用快捷键"Ctrl"

C# WinForm判断Win7下是否是管理员身份运行

原文:C# WinForm判断Win7下是否是管理员身份运行如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常 Vista 和 Windows 7 操作系统为了加强安全,增加了 UAC(用户账户控制) 的机制,如果 UAC 被打开,用户即使是以管理员权限登录,其应用程序默认情况下也无法对系统目录,系统注册表等可能影响系统运行的设置进行写操作.这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC

电脑保持用管理员身份运行程序

  我们知道,在win7系统中,若要以管理员身份运行程序是需要逐步进行操作的,那么是否有办法可以跳过这些步骤,让我们在win7下保持用管理员身份运行程序?下面win7之家为您详解一下: 第一种方法:鼠标指向需要运行的程序,然后点击右键选择属性. 接下来选择兼容性选项,然后在下面的特权等级中将"以管理员身份运行此程序"勾选上即可. 第二种方法:在程序的快捷方式中进行设置.首先依然是打开程序的属性窗口. 然后选择快捷方式的选项,然后点击下面的高级. 在高级属性中勾选"用管理员身份