.NET中提高UAC权限的不二法门计算

C++ 1

C++ 2

http://blogs.msdn.com/b/winsdk/archive/2010/05/31/dealing-with-administrator-and-standard-user-s-context.aspx摸索到了那二者的分别,差别如下:

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

当然,依旧应该认清一下种类的本子的,确保系统是Vista及之后的本子,否则就不须求提高权限了。判断是或不是是Vista只要求看清系统主版本号是还是不是超过等于6就可以了,例如以下的代码。

1 SendMessage(button1.Handle, BCM_SETSHIELD, 0, (IntPtr)1);
 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 }
  1. 程序运行前进步权限
  2. 程序运行后升级权限
  3. 次第中判断当前权限

【小说索引】

假设一切程序都亟需利用管理员权限的话(甚至主界面上展现的内容都亟待管理员权限才行),那么可以让程序一运行时就晋级管理员权限,如同同大部分的安装程序一样。程序运行时增进权力寻常选择设置manifest文件的主意,可以在项目中丰硕“应用程序清单文件”,添加完毕后会生成如下图所示的一个文件。除此之外,也得以经过接纳品种性质,然后进入“安全性”选项卡,然后接纳“启用
ClickOnce
安全设置”后也会在品种的“Properties”目录下生成app.manifest文件。

 

  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/

里头App1使用的是highestAvailable,而App2则动用的是requireAdministrator,可以看看在Administrator用户下都亟待进步权限来运转,在关闭UAC的时候都不必要升级权限。而例如在Guest下highestAvailable遗弃了晋级权限,同时如若选拔requireAdministrator的话则会唤醒类似下图的输入任何管理员账户密码的对话框:

Possible requested execution level values

唯独假使要往菜单上依旧WPF的Button上制图UAC盾牌的图标就无奈那样去做了,然而好在大家仍可以获取到系统图标,不嫌弃的话可以用.NET自带的System.Drawing.SystemIcons.Shield,其实过多软件用的就是以此图标,原图如下(32×32):

C++ 3

除了得到当前是或不是是以管理人运行,还足以经过DllImport的措施得到到当下用户是或不是是管理员用户以及当前进程是还是不是提高了权力(仅限Vista及以上的版本)等等,详情可以见相关链接2中的代码。

从Vista开首,由于扩展了UAC(用户账户控制,User Account
Control)成效,使得管理员用户平日不再抱有能说了算所有功效的领队权限了,所以在调用很多相比较首要的功能时要求升级权限来贯彻。有时候写的先后须求调用那种权力,那么大致就是分为运行前就进步以及运行后再升级二种,在此地整理如下。

 

【相关链接】

在诠释中很令人惊讶标求证了即使要在先后中一经急需更高的权能要求修改哪部分,然则那些惊叹,这段注释并不曾表明应该修改成哪类形式。

【二、程序运行后升级权限】
一旦程序默许不需求权限就能运作半数以上意义,只是在分级作用上急需管理员权限的话,那么可以动用程序运行后,当用户必要升级权限的时候再升格权限重新运行程序。由于权力是按进程来的,所以只要急需升级全方位程序的权力,只可以以管理员权限创立进度将来再截至本程序,或者以管理员权限运行其余程序依旧程序通过差距参数来推行不一效用。以管理人权限履行顺序其实格外简单,只要将ProcessStartInfo对象的Verb属性设置为“runas”即可,例如如下的代码即可以管理员权限重启本程序。

C++,除了,大家兴许还亟需在那些按钮或菜单上制图UAC盾牌的图标,其实系统现已提供了那样的法门。

下一场如下调用就足以将UAC盾牌的图标设置到菜单上了:

【一、程序运行前进步权限】

 

为此,如果一个主次必须要求管理员权限才能履行或者才能履行得有意义(比如主界面上的信息要求管理员权限才能突显之类的),那么不妨设置为requireAdministrator,即便使用Guest登陆的话也亟需进步管理员权限;否则也可设置为highestAvaliable。

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;

【题外话】

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.

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();

当然,也可以经过DllImport的艺术从系统中获得系统内置的图标,其中UAC盾牌的图标的ID是77,代码如下。

 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 }

 

调用的时候假若将按钮的FlatStyle设置为System,然后使用如下的代码就可以了,最终一项假若设为0的话则会撤废显示UAC的盾牌图标。

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

比方要看清当前是不是以管理人身份运行,只需引用“System.Security.Principal”那些命名空间,然后就足以由此如下的代码获取当前是还是不是以管理员在运转。

C++ 4

图中menu1是行使的System.Drawing.SystemIcons.Shield,menu2应用的通过shell32.dll获取到的图标,button1是使用的SendMessage直接浮现的UAC的图标。

 

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

C++ 5

分别即是,highestAvailable按时下账号能博得到的权杖履行,而requireAdministrator则是以拥有完整权限的领队运行。如果当前账户是管理员账户的话,那么双方都是可以的通过升级权限来赢得到管理员权限的;而一旦当前账户是Guest的话,那么highestAvailable则屏弃进步权限而直白运行,而requireAdministrator则允许输入任何管理员账户的密码来进步权限。

本来,运行其余程序也是如出一辙的。