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

转载 2015年02月04日 20:12:41

 如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常。

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。


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

<?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。


跟我学XSL(四)

  XML技术的优势之一就在于数据输出的可选择性,即选择需要的数据输出。前面我们所讲到的选择模式语句:、及只是简单的选取通过”/”符号层层到达的节点,如果我们对XML数据不需要全部输出,而只需要其中的...
  • ghj1976
  • ghj1976
  • 2001-06-01 16:26:00
  • 1787

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

如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常   Vista 和 Windows 7 操作系统为了加强安全,增加了 ...
  • lcawen
  • lcawen
  • 2013-01-23 16:59:40
  • 2388

C# 判断软件是否是管理员权限运行

using System.Security.Principal; public static bool IsAdministrator() { Windows...
  • zuoyefeng1990
  • zuoyefeng1990
  • 2017-03-15 14:45:22
  • 750

【C#】如何使程序以管理员身份运行

在部分win7和win10上,现在加入了账户控制,有些程序如果要写注册表,如要开机自启动,需要程序以管理员身份运行。那如何在编译的时候就让程序以管理员身份运行呢? 1.右击项目-》属性-》安全性-》勾...
  • zhaoyuqings
  • zhaoyuqings
  • 2016-11-29 15:44:33
  • 1086

在VS中如何让C#语言编写的程序自动以管理员身份运行

在Vista或Win7或Win8或Win10系统上exe程序默认不是以管理员身份运行的,它会被UAC(用户帐户控制)阻止访问系统某些功能,如修改注册表操作、操作硬盘上的文件等。但是有时我们确实需要程序...
  • songyi160
  • songyi160
  • 2015-11-19 13:29:13
  • 1641

怎样在Windows7始终以管理员身份运行程序

众所周知,在微软的新一代操作平台 —— Windows7 中,若要以管理员身份运行程序,通常会使用以下两种方法:   (1)在程序或其快捷方式上右键鼠标,选择“以管理员身份运行”;   (2)使用...
  • wyxz126
  • wyxz126
  • 2013-02-27 12:02:56
  • 933

C# 以管理员方式启动Winform,进而使用管理员控制Windows Service

C# 以管理员方式启动Winform,进而使用管理员控制Windows Service http://www.cnblogs.com/yy3b2007com/p/4415330.html 问题起因: ...
  • woaizard100
  • woaizard100
  • 2017-08-17 18:33:59
  • 312

delphi 自动以管理员身份运行程序

  • 2012年05月29日 22:15
  • 2KB
  • 下载

C# WinForm在Win7系统中以管理员权限运行

在VS2010  IDE开发环境中,查看当前项目中是否包含了app.manifest文件,如果没有,则添加“应用程序清单文件”。 双击此文件,发现其是一xml格式的文件,有节点如下:     ...
  • after2010
  • after2010
  • 2013-05-09 15:19:17
  • 7350

Windows7 自动“以管理员身份运行”某程序

自从 VirtualBox 设置了共享目录之后,必须以管理员身份运行才能使用软链接功能。每次开机之后,习惯性双击VirtualBox启动它,等进了系统之后发现git命令不能使用,才想起没有以管理员身份...
  • ganshuyu
  • ganshuyu
  • 2015-03-26 11:41:48
  • 3397
收藏助手
不良信息举报
您举报文章:C# WinForm判断Win7下程序是否以管理员身份运行
举报原因:
原因补充:

(最多只允许输入30个字)