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。


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

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

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

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

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

C#程序以管理员权限运 在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况...
  • huwei2003
  • huwei2003
  • 2014年04月21日 10:35
  • 19172

C#默认以管理员身份运行程序

http://blog.csdn.net/testcs_dn/article/details/9903727  C#默认以管理员身份运行程序 一、通过配置文件实现以管理员身份运行程...
  • ruanjianruanjianruan
  • ruanjianruanjianruan
  • 2016年07月18日 22:52
  • 1276

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

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

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

如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常...
  • ja38911
  • ja38911
  • 2014年06月10日 14:25
  • 663

将exe程序在Win7下以管理员权限运行的方法

[+] 什么是UAC? 在Windows7中加入了UAC(User Account Control,用户帐户控制)的功能,UAC是微软为提高系统安全而引入的,它要求用户在执行可能会影响计算机运行的...
  • jearmy
  • jearmy
  • 2015年05月02日 13:26
  • 3654

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

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

判断进程是否"以管理员身份运行"

bool IsRunAsAdministrator(DWORD dwProcessId, bool bCurrentProcess) { bool bIsElevated = false; ...
  • hellokandy
  • hellokandy
  • 2016年08月02日 20:23
  • 680

C#默认以管理员身份运行程序

一、通过配置文件实现以管理员身份运行程序 Vista 和 Windows 7 操作系统为了加强安全,增加了 UAC(用户账户控制) 的机制,如果 UAC 被打开,用户即使是以管理员权限登录,其应用...
  • testcs_dn
  • testcs_dn
  • 2013年08月11日 19:13
  • 10407
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# WinForm判断Win7下程序是否以管理员身份运行
举报原因:
原因补充:

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