必威电竞外围网站.NET中提升UAC权限的方式总结。如何给 Win7 下之桌面应用程序以管理人权限运行。

【题外话】

Vista 和 Windows 7 操作系统为提高平安,增加了 UAC(用户账户控制)
的机制,如果 UAC
被辟,用户就是是盖管理员权限登录,其应用程序默认情况下吧束手无策对网目录,系统注册表等可能影响系运行的安进行摹写操作。这个机制大大提高了系统的安全性,但针对应用程序开发者来说,我们无克迫使用户失去关闭UAC,但偶尔我们付出的应用程序又用以
Administrator 的点子运行,即 Win7 中 以 as administrator
方式运行,那么我们怎么来兑现这样的功用为?

起Vista开始,由于长了UAC(用户账户控制,User Account
Control)功能,使得管理员用户平时不再持有能够说了算所有机能的组织者权限了,所以在调用很多比较主要的成效时要提升权限来贯彻。有时候写的次需要调用这种权力,那么大概就是分为运行前纵晋级及运行后重新提升片种植,在此处整理如下。

 

 

我们以 win7
下运行有安装程序时,会发觉首先弹来一个会话框,让用户必威电竞外围网站确认是不是同意允许这个序改变而的计算机配置,但我们编辑的应用程序默认是未会见弹出这个提示的,也无能为力因为管理人权限运行。本文介绍了
C# 程序如何设置来唤起用户因管理员权限运行。

【文章索引】

先是在品种中多一个 Application Manifest File

  1. 程序运行前提升权限
  2. 程序运行后升级权限
  3. 先后中判断当前权限

 

 

必威电竞外围网站 1

【一、程序运行前提升权限】

 

只要全勤程序都亟待使用管理员权限的言语(甚至主界面上显示的情还需管理员权限才行),那么可吃程序一样运行时即便提升管理员权限,就像大部分之安装程序一样。程序运行时提高权力通常采用设置manifest文件的艺术,可以以列蒙加上“应用程序清单文件”,添加完成后会转变如下图所展示之一个文件。除此之外,也得以经过增选项目性质,然后上“安全性”选项卡,然后选择“启用
ClickOnce
安全设置”后为会见当路的“Properties”目录下生成app.manifest文件。

默认的配置如下:

必威电竞外围网站 2

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

每当诠释中老引人注目的证实了如果一旦于先后中一经要重胜似的权需要修改哪有,不过好奇怪,这段注释并从未证明应该改成啦种艺术。

 

在http://blogs.msdn.com/b/winsdk/archive/2010/05/31/dealing-with-administrator-and-standard-user-s-context.aspx找寻到了这两者的界别,区别如下:

我们可以看此布局中生出一个 requestedExecutionLevel
项,这个起用于配置时下请求的执行权级别。这个桩有3独价值可供应选择,如下表所示:

Possible requested execution level values

 

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.

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.

有别于就凡是,highestAvailable按目前账号能博取到之权力履行,而requireAdministrator则是以所有整体权限的组织者运行。如果手上账户是管理员账户的话,那么双方都是可以的经升级权限来收获到管理员权限的;而若手上账户是Guest的语,那么highestAvailable则放弃提升权限而一直运行,而requireAdministrator则允许输入任何管理员账户的密码来提升权限。

 

必威电竞外围网站 3

asInvoker : 如果选者,应用程序就是为时底权杖运行。

中App1使用的凡highestAvailable,而App2则采取的是requireAdministrator,可以看在Administrator用户下都亟需升级权限来运转,在关闭UAC的时刻还无欲提升权限。而据以Guest下highestAvailable放弃了晋升权限,同时如果应用requireAdministrator的言语虽会唤起类似下图的输入外管理员账户密码的对话框:

highestAvailable: 这个是坐当下用户可得的嵩权力运行。

必威电竞外围网站 4

requireAdministrator: 这个是只是因系统管理员权限运行。

之所以,如果一个程序必须要求管理员权限才会履行要才会履行得有含义(比如主界面上的信息用管理员权限才能够显示之类的),那么不妨装也requireAdministrator,即使采用Guest登陆的言辞也需要提升管理员权限;否则也可设置为highestAvaliable。

 

 

默认情况下是 asInvoker。

【二、程序运行后升级权限】
若程序默认不需权限就能运行大部分效能,只是当分级功能及急需管理员权限的话,那么可以以程序运行后,当用户需升级权限的上还升级权限重新运行程序。由于权力是按进程来之,所以如果需要提升全体程序的权位,只能以管理人权限创建过程以后重新结本程序,或者以管理人权限运行其他程序还是程序通过不同参数来实行不一功效。以管理员权限履行顺序其实非常简单,只要拿ProcessStartInfo对象的Verb属性设置也“runas”即可,例如如下的代码即可以管理员权限重新启本程序。

highestAvailable 和 requireAdministrator
这片个选项都可唤起用户得到系统管理员权限。那么就简单只选择之区别在哪也?

 1 ProcessStartInfo psi = new ProcessStartInfo();
 2 psi.FileName = Application.ExecutablePath;
 3 psi.Verb = "runas";
 4 
 5 try
 6 {
 7     Process.Start(psi);
 8     Application.Exit();
 9 }
10 catch (Exception eee)
11 {
12     MessageBox.Show(eee.Message);
13 }

他俩的区分在于,如果我们无是盖管理人帐号登录,那么一旦应用程序设置为
requireAdministrator
,那么应用程序就直接运行失败,无法启动。而要设置为
highestAvailable,则应用程序可以运作成功,但是是盖目前帐号的权杖运行而不是系统管理员权限运行。如果我们想程序于非管理员帐号登录时也得运行(这种情况下应该某些意义于限制)
,那么建议下 highestAvailable 来配置。

理所当然,运行其他程序也是相同的。

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

除了,我们也许还需以此按钮或菜单上制图UAC盾牌的图标,其实系统就提供了这般的计。

Create and Embed an Application Manifest
(UAC)

1 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
2 public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, IntPtr lParam);
3 
4 public const UInt32 BCM_SETSHIELD = 0x160C;

 

调用的时刻如果拿按钮的FlatStyle设置也System,然后下如下的代码就可了,最后一宗如果设为0的言辞虽会吊销显示UAC的干图标。

下是修改后底配置文件:

1 SendMessage(button1.Handle, BCM_SETSHIELD, 0, (IntPtr)1);
<?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 后,程序才可以继续运行,并且获得系统管理员的权限。

但若是一旦朝着菜单上或WPF的Button上制图UAC盾牌的图标就无可奈何这样去做了,不过好以咱们尚得博到系统图标,不嫌弃的口舌可用.NET自带的System.Drawing.SystemIcons.Shield,其实过多软件用之就算是这图标,原图如下(32×32):

必威电竞外围网站 5

必威电竞外围网站 6

 

自,也堪由此DllImport的主意自网遭到拿走系统内置的图标,其中UAC盾牌的图标的ID是77,代码如下。

脚还来探视程序如何掌握当前运作在系统管理员权限还是无系统管理员权限:

 1 [DllImport("shell32.dll", SetLastError = false)]
 2 public static extern Int32 SHGetStockIconInfo(SHSTOCKICONID siid, SHGSI uFlags, ref SHSTOCKICONINFO psii);
 3 
 4 public enum SHSTOCKICONID : uint
 5 {
 6     SIID_SHIELD = 77
 7 }
 8 
 9 [Flags]
10 public enum SHGSI : uint
11 {
12     SHGSI_ICON = 0x000000100,
13     SHGSI_SMALLICON = 0x000000001
14 }
15 
16 [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
17 public struct SHSTOCKICONINFO
18 {
19     public UInt32 cbSize;
20     public IntPtr hIcon;
21     public Int32 iSysIconIndex;
22     public Int32 iIcon;
23 
24     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
25     public string szPath;
26 }

 

然后如下调用就得以UAC盾牌的图标设置及菜单上了:

        public static bool IsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
1 SHSTOCKICONINFO iconInfo = new SHSTOCKICONINFO();
2 iconInfo.cbSize = (UInt32)System.Runtime.InteropServices.Marshal.SizeOf(iconInfo);
3 SHGetStockIconInfo(SHSTOCKICONID.SIID_SHIELD, SHGSI.SHGSI_ICON | SHGSI.SHGSI_SMALLICON, ref iconInfo);
4 Icon icon = Icon.FromHandle(iconInfo.hIcon);
5 
6 menu.Image = icon.ToBitmap();

 

图被menu1凡是运的System.Drawing.SystemIcons.Shield,menu2应用的经过shell32.dll获取到之图标,button1是使的SendMessage直接显示的UAC的图标。

当即段代码可以用来判断当前次是否运行在系统管理员权限下。如果安排也
asInvoker,在win7 下,这个函数会回到 false ,如果是
requireAdministrator  则回 true。

必威电竞外围网站 7

当然,还是应认清一下系统的本子的,确保系统是Vista及以后的本,否则就是未待升级权限了。判断是否是Vista只需要判定系主版本号是否超等于吃6就可了,例如以下的代码。

1 Boolean afterVista = (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major >= 6);

 

【三、程序中判断当前权限】

要如认清当前是不是坐管理人身份运行,只待引用“System.Security.Principal”这个命名空间,然后便足以经过如下的代码获取当前是不是为管理员在运转。

1 WindowsIdentity identity = WindowsIdentity.GetCurrent();
2 WindowsPrincipal principal = new WindowsPrincipal(identity);
3 Boolean isRunasAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

除此之外取当前是否是为管理员运行,还足以经过DllImport的办法取到手上用户是否是组织者用户和当前过程是否升级了权(仅限Vista及以上的本)等等,详情可呈现相关链接2着之代码。

 

【相关链接】

  1. 编写C#程序于那于Win7
    下坐管理员权限运行:http://www.cr173.com/html/11557_1.html
  2. UAC self-elevation
    (CSUACSelfElevation):http://code.msdn.microsoft.com/windowsdesktop/CSUACSelfElevation-644673d3
  3. How to add an uac shield icon to a
    MenuItem:http://www.peschuster.de/2011/12/how-to-add-an-uac-shield-icon-to-a-menuitem/

相关文章

admin

网站地图xml地图