.NET中提升UAC权限的方法总结

[Qt]新增UAC功能之requireAdministrator 我们知道, win7及以上的系统权限控制的非常严格,普通用户在系统目录下没有写的权限,软件经常要写一些配置文件之类的功能就无法操作, 其实特定目录没有写的权限,但软件会运行的好好的,表面没有任何问题,它会自己重定向到C:\Users\当前登录用户名\AppData\Local\VirtualStore\类似这样的文件夹下 而且也能顺利的读取写进去的数据,win7及以上的系统有这样的重定向机制, 阅读详情

【文章索引】

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

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

如果整个程序都需要使用管理员权限的话(甚至主界面上显示的内容都需要管理员权限才行),那么可以让程序一运行时就提升管理员权限,就如同大部分的安装程序一样。程序运行时提高权限通常采用设置manifest文件的方式,可以在项目中添加“应用程序清单文件”,添加完成后会生成如下图所示的一个文件。除此之外,也可以通过选择项目属性,然后进入“安全性”选项卡,然后选择“启用 ClickOnce 安全设置”后也会在项目的“Properties”目录下生成app.manifest文件。

在注释中很明确的说明了如果要在程序中如果需要更高的权限需要修改哪部分,不过非常好奇,这段注释并没有说明应该修改成哪种方式。

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

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.

区别即是,highestAvailable按当前账号能获取到的权限执行,而requireAdministrator则是以具有完整权限的管理员运行。如果当前账户是管理员账户的话,那么两者都是可以的通过提升权限来获取到管理员权限的;而如果当前账户是Guest的话,那么highestAvailable则放弃提升权限而直接运行,而requireAdministrator则允许输入其他管理员账户的密码来提升权限。

其中App1使用的是highestAvailable,而App2则使用的是requireAdministrator,可以看出在Administrator用户下都需要提升权限来运行,在关闭UAC的时候都不需要提升权限。而比如在Guest下highestAvailable放弃了提升权限,同时如果使用requireAdministrator的话则会提示类似下图的输入其他管理员账户密码的对话框:

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

 

【二、程序运行后提升权限】

如果程序默认不需要权限就能运行大部分功能,只是在个别功能上需要管理员权限的话,那么可以采用程序运行后,当用户需要提升权限的时候再提升权限重新运行程序。由于权限是按进程来的,所以如果需要提升整个程序的权限,只能以管理员权限创建进程以后再结束本程序,或者以管理员权限运行其他程序或者程序通过不同参数来执行不同功能。以管理员权限执行程序其实非常简单,只要将ProcessStartInfo对象的Verb属性设置为“runas”即可,例如如下的代码即可以管理员权限重启本程序。

复制代码
 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 }
复制代码

当然,运行其他程序也是一样的。

除此之外,我们可能还需要在这个按钮或菜单上绘制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);

不过如果要往菜单上或者WPF的Button上绘制UAC盾牌的图标就没法这样去做了,不过好在我们还可以获取到系统图标,不嫌弃的话可以用.NET自带的System.Drawing.SystemIcons.Shield,其实好多软件用的就是这个图标,原图如下(32×32):

当然,也可以通过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盾牌的图标设置到菜单上了:

复制代码
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的图标。

当然,还是应该判断一下系统的版本的,确保系统是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中的代码。

基于多源数据分析的MATLAB安装UAC权限限制解决方案及自动化处理示例 在Windows系统中,MATLAB安装过程中常因用户账户控制(UAC)拦截导致权限不足问题,主要表现为安装程序未自动触发UAC权限提升、UAC设置级别过高或用户账户非管理员组成员。为解决这些问题,可通过以下方法: 强制以管理员身份运行安装程序:使用批处理脚本检测并提升权限,确保安装程序以管理员身份运行。 动态调整UAC设置:通过PowerShell脚本临时调整UAC级别,安装完成后恢复默认设置。 权限验证与用户组检查:在MATLAB脚本中预检系统环境,确保用户具备管理员权限。 此外,大数据分析显示UAC问 阅读详情

相关推荐

深入理解.NET代码访问权限与UAC设置

本文详细探讨了.NET框架中代码访问权限的管理方法,通过实际案例分析了权限设置对应用程序行为的影响。同时,介绍了用户帐户控制(UAC)的作用和重要性,以及如何在应用程序清单中定义UAC设置来提升应用程序的安全性。此外,文章还提供了.NET SDK中安全工具的概述,并对SecurityException类的新属性进行了说明。

weixin_42234168的博客 400

C# 应用程序设置运行时自动获取管理员权限,不显示uac提升权限提示

c#

u011555996的博客 3930

代码访问权限管理与UAC配置实践

本文深入探讨了.NET框架中代码访问权限的管理方法,以及用户账户控制(UAC)在应用程序安全设置中的应用。通过具体的示例代码,解释了如何在程序中设置权限、处理权限异常,并介绍了.NET SDK提供的安全工具。文章还详细讨论了UAC的原理、配置以及如何根据权限需求设置应用程序的UAC级别。

weixin_34268462的博客 532

C# ClickOnce不支持请求执行级别"requireAdministrator"

搜索这个问题时,出现的解决方案为: 【解决方案资源管理器】属性的【安全性】选项卡,取消【启用ClickOnce安全设置】 但是这样做在重新发布时仍然会被重新勾选,我的解决方案为: 在入口程序下的properties目录中,有app.manifest,右键使用记事本打开或者notepad++之类的编辑器,找到requestedExecutionLevel,变更为: <!-- UAC 清单选项 如果要更改 Windows 用户帐户控制级别,请用以下节点

mofeimo110的博客 5606

带标签的PHM2009齿轮箱数据集

PHM2009附加数据集—带标签的齿轮箱数据集,可用于测试算法

qq_39379705的博客 4877

《惠普工作站设置BIOS从U盘装系统》

惠普工作站设置BIOS 惠普工作站在做服务器时应用广泛,本文介绍下其BIOS开机自启动设置,附上图片,以供学习参考。 惠普工作站设置BIOS 启动步骤如下: 第一步:根据需要对BIOS进行更改,并保存 1.重启工作站按F10进入BIOS设置(也可以按ESC键选择进入BIOS设置的选项)。 图1 惠普工作站B...

istrangeboy&begin zero的博客 2万+

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

有些代码操作需要取得管理员权限,不如把整个程序设置为以管理员运行。 C#程序设置以管理员权限运行,比较简单: 1. 为项目添加manifest文件(已添加的则跳过)。 2.requestedExecutionLevel 设置为 requireAdministrator <!-- <requestedExecutionLevel level="asInvoker" uiAccess="false" /> --> <requestedExecutionLevel le..

小鹰信息技术服务部 7331

Prompt Learning 简介

• Prompt Learning 可以将所有的任务归一化预训练语言模型的任务• 避免了预训练和fine-tuning 之间的gap,几乎所有 NLP 任务都可以直接使用,不需要训练数据。• 在少样本的数据集上,能取得超过fine-tuning的效果。• 使得所有的任务在方法上变得一致。

jxsdq的博客 1万+

Cannot create ActiveX componet [VB.net]

<br />That's because it requires adminstrator privilege. Change the project's setting from (#2 is required if it is Win32 program)<br /> <br />1.project -> properties ->   Application -> View UAC settings:  <br /> <br /><security><br />      <requestedPriv

acuna1的专栏 2044

cesium轨迹线(图片轨迹线)

文章介绍了如何在Cesium中实现图片轨迹线的效果。通过使用ellipse方法加载圆形,并修改polyline中的material方法,重写GLSL来实现动态的轨迹线效果。文章提供了完整的示例代码,包括HTML和JavaScript部分,展示了如何通过自定义的PolylineImageTrailMaterialProperty类来实现这一效果。该类的核心在于通过_definitionChanged事件、getValue方法以及相关属性(如颜色、速度、图片等)来动态生成轨迹线。文章还提供了源码链接,方便读者进

God's asylum的博客 1456

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

伶俐角少儿编程 467

Vista下UAC兼容程序开发的几点体会

1、当应用程序需要提升权限时UAC总是会提示;2、VC6编译的可执行程序默认是以“管理员”之类的较高的用户权限运行的;3、如果将VC6的工程直接转换至.Net2005,编译的可执行程序仍默认以“管理员”之类的较高用户权限运行的,这可能与工程中某些配置有关,如果有哪位大侠知道请告诉我。目前我解决这个问题的办法是在.Net2005中新建一个工程,然后将VC6工程下的各个类文件添加到新工程中,编译后的可

XinhuaSoft 1111

基于uniapp开发PDA扫码枪APP:实现RFID批量扫描读取功能

基于uniapp的PDA扫码枪APP开发实战,实现高效RFID读取功能,uniapp整合PDA硬件的实践分享,基于uniapp的PDA端RFID批量扫描方案开发

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

Win7开发系列: Win7 UAC帮助类

我有一个应用程序需要检测是否正在升高的特权。我现在代码建立这样的:函数功能 : 是否是管理员privatestaticbool_isAdministrator(){WindowsIdentityidentity=WindowsIdentity.GetCurrent();WindowsPrincipalprincipal=newWindowsPrincipal...

weixin_33830216的博客 84

为Skill开发的python脚本一些经验

其中SKILL.md的职责是调度,不是实现,这里面要写清楚如下三点: 脚本会自动生成: 如果缺少依赖: 这样就实现了分工,脚本用来完成格式转换、统计计算、文件生成;Claude做理解用户意图、选择参数、解释结果、处理特殊需求等。Claude 调用脚本时,所有参数都通过命令行传递,本质上都是字符串。但在脚本内部,应该明确转换成正确类型,而不是全程当字符串用。因此,强烈建议使用argparse里声明正确的type,如下: 的 参数会自动做转换和报错,比在代码里手动 更安全,报错信息也更清晰。特别注意如下

Criss@陈磊 855

PyTorch实战(19)——变分自编码器(Variational Autoencoder,VAE)

变分自编码器 (Variational Autoencoder, VAE) 是一种结合了自编码器和概率建模的生成模型,通过编码器将输入数据映射到潜在空间中的概率分布,并通过解码器将从潜在空间采样得到的潜在变量映射回原始数据空间,实现了数据的生成和特征学习。本节中,将介绍变分自编码器的基本概念,并使用 PyTorch 实现变分自编码器生成新图像。

盼小辉丶的博客 2938

.NET中提升当前进程的UAC权限

       User Account Control (UAC)是从windows vista系统开始增加的一个安全控制组件。正常情况下,应用程序都运行在较低的权限级别上,但有时不得不强制要求当前进程以较高的安全级别上运行,这时就希望程序自身能够强制要求用户提升当前进程的权限,下面的方法就实现了权限检测与提升。 /// /// 检查当前进程是否以administrator身份运行 /// /// /// public bool IsRunAsAdmin() { Windows

boral_li的专栏 2038

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# 控制台使用 UAC 权限

C# 控制台使用 UAC 权限 原文:C# 控制台使用 UAC 权限 本文告诉大家如何在 C# 控制台项目使用 UAC 权限。这个方法在 WPF 和 控制台都是可以使用。 右击项目,点击添加文件,找到程序清单 在 WPF 使用 UAC 也是一样的方法。 打开这个创建的文件,可以...

weixin_30731287的博客 684

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

UAC白名单管理工具:告别烦人的权限弹窗

你是否曾经因为频繁的UAC权限弹窗而感到困扰?每次运行某些需要管理员权限的软件时,那个蓝色的提示窗口总会打断你的操作流程。现在,UAC白名单管理工具为你提供了一个完美的解决方案,让你既能保持系统的安全性,又能享受流畅的使用体验。 ## 为什么需要UAC白名单工具 在日常使用Windows系统时,很多软件都需要管理员权限才能正常运行。但每次启动这些软件都会触发UAC弹窗,这不仅影响效率,还会让人

gitblog_01058的博客 789

SharpSploit令牌操作与权限提升:用户模拟与UAC绕过技术

SharpSploit是一个功能强大的.NET后渗透测试库,用C#编写,提供了丰富的令牌操作功能,可用于用户模拟和UAC绕过,帮助安全测试人员在授权范围内评估系统安全性。 ## 一、令牌操作基础:用户模拟技术 ### 1.1 令牌的核心作用 在Windows系统中,令牌是进程访问资源的关键凭证。SharpSploit的令牌操作模块位于[SharpSploit/Credentials/Toke

gitblog_00830的博客 347

uac绕过ui保护_UAC攻击剖析

前言在这篇文章中,我们将讨论UAC(用户帐户控制)绕过攻击中涉及到的基本原则。UAC(User Account Control,用户帐户控制)是微软为提高系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员‌密码。UAC在Windows Vista中被引入,使管理员用户能够使用标准用户权限而不是管理...

weixin_39835147的博客 1394

Windows权限提升实战:Bypass UAC与PowerUp本地提权路径剖析

权限提升是渗透测试与红队评估中的核心技术环节,指从低权限账户逐步获取系统高级控制权的过程。其原理在于利用操作系统安全机制的配置缺陷或逻辑漏洞,例如服务权限配置错误、注册表键值滥用或系统程序自动提权特性。这项技术的核心价值在于突破内网横向移动瓶颈,为后续深入渗透与核心资产访问奠定基础。在Windows环境中,Bypass UAC和基于PowerUp的本地提权是两种经典应用场景。前者针对已属管理员组但受用户账户控制限制的会话,通过劫持系统白名单程序执行流程实现静默提权;后者则通过自动化检测服务配置、计划任务、凭

weixin_30516243的博客 409

【C#】通过编程方式获取 UAC 用户账户控制通知级别以及 UAC 的介绍

UAC 设置是我们在程序开发中启动的外部进程能否正常提权 (获取管理员权限) 的关键。因此,我们有必要事先获取当前系统的 UAC 通知级别来决定是否启动外部进程或者是提示用户进行相关操作从而避免因提权失败导致的异常现象。这期就讲讲如何在 C# 中获取系统 UAC 通知级别,可以适用于 Windows 7 ~ 11 (其他系统请自行测试)。首先我们得先清楚 UAC 4个通知级别的含义。UAC 设置可以通过开始菜单搜索 (Win+S)

WHNde优快云的博客 1191

UAC白名单终极指南:彻底告别烦人弹窗的完整教程

还在为Windows系统频繁弹出的UAC权限提示而烦恼吗?想要提升游戏启动速度和开发效率?这份UAC白名单工具的完整指南将为你提供从基础到进阶的全面解决方案,帮助你轻松管理Windows权限设置,让常用程序运行更加顺畅。 ## 问题诊断:为什么你需要UAC白名单管理? Windows的UAC(用户账户控制)机制虽然增强了系统安全性,但在日常使用中却带来了诸多不便: - **游戏玩家困扰**:

gitblog_00205的博客 1179
上一篇: 使用WebBrowser获取网页源代码,解决中文乱码问题
下一篇: PHP 【解决】中文乱码问题
拿铁加不加糖
博客等级 码龄16年 75粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值