[Win32] UAC用户账户控制 (提权)
最近写程序时遇到一个问题,就是当一个程序需要管理员权限才能正常运行该怎么办?
通过查阅多方资料,我总结出来几个比较实用的办法(每种办法实现方法不同,同时功能上也有一些小小的差异)
方法一(批处理脚本)
@echo off
if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%SystemRoot%\SysWOW64;%~dp0
bcdedit >nul
if '%errorlevel%' NEQ '0' (goto UACPrompt) else (goto UACAdmin)
:UACPrompt
%1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&exit
exit /B
:UACAdmin
cd /d "%~dp0"
;你的代码写在这里,你可以在在这里启动你的程序
这个批处理脚本代码可以以管理员身份启动,并且会以文件所在位置为工作环境。
所以,只要用这个脚本启动你的程序即可以管理员身份启动你的程序。
缺点:
- 会有一个命令提示符窗口一闪而过;
- 程序启动入口是个批处理文件。
方法二(manifest)
在 VS 编辑器里这样设置项目属性后再编译出来的程序就会有个 UAC 盾,以后你的程序只要运行就都会请示管理员权限。


方法三(动态提权)
所谓动态提权,就是一个没有管理员权限的程序进程在他认为合适的时候创建一个有管理员权限的程序进程,代码很简单:
HINSTANCE ShellExecuteA(
[in, optional] HWND hwnd, // 父窗口的句柄,用于显示 UI 或错误消息。如果操作未与窗口关联,则此值可以为NULL。
"runas",
[in] LPCSTR lpFile, // 你的程序路径
[in, optional] LPCSTR lpParameters, // 需要传递的参数
[in, optional] LPCSTR lpDirectory, // 默认(工作)目录。如果此值为 NULL,则使用当前工作目录。如果在 lpFile 中提供了相对路径,则不要对 lpDirectory 使用相对路径。
[in] INT nShowCmd // 指定应用程序在打开时如何显示
);
其中 INT nShowCmd 参数具体可参考 Microsoft Docs - ShowWindow function,
具体函数详情参考 ShellExecuteA function (shellapi.h)。
方法四(利用微软 Windows 的漏洞)
这些方法因为不推荐使用,所以不多介绍了。有 Windows UAC 漏洞,但是微软会想办法去修补的,所以这类方法容易失效。
补充资料
基本概念:
1。进程的权限是继承的,也就是说,有管理员权限的程序创建的进程也有管理员权限,没有管理员权限的程序创建进程就没有管理员权限(但高权限进程创建进程必须是高权限不是绝对的)
2。Windows Shell进程explorer本身没有管理员权限,如果explorer有管理员权限,大家可以想一下,那么它创建的进程都有管理员权限,那UAC不就形同虚设了吗
3。没有权限的进程不能创建有权限的进程!是的,你没有听错,就是不能,这是Windows操作系统规定的。但你可能会问“那么如何提权?你不是说连explorer都没有权限吗?”,答案是:Windows系统中有一个开机自启的AppInfo服务,它直接以系统权限运行,在一个管理员用户登录时,系统会保留一份当前用户的高权限令牌并传给AppInfo服务,提权的过程本身就是一个进程通过进程通信把要提权的程序传给AppInfo服务,AppInfo服务会运行一个UI进程,UI进程会接收用户响应,如果用户同意这次提权,AppInfo服务就使用高权限令牌在当前用户会话的交互窗口站的当前桌面创建管理员权限的进程,创建时将进程的父进程替换为请求提权的进程。这样我们看起来就好像是“没权限进程创建有权限进程”了,其实高权限进程不是它创建的。
参考文档
让bat批处理以管理员权限运行的实现方法
[Win32] UAC用户账户控制(提权+降权)
Microsoft 技术文档
声明
本文作者:SeaYJ
转载请注明出处:https://www.cnblogs.com/SeaYJ/p/15732266.html
[Win32] UAC用户账户控制 (提权)的更多相关文章
- Win8系统如何关闭用户账户控制UAC
按WIN+S,屏幕右侧出现搜索框,在搜索框中输入UAC,然后单击"更改用户账户控制设置" 然后把弹出的窗口改成"从不通知"就可以了
- win7如何设置某个软件不弹出用户账户控制
手动修改注册表: 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面 ...
- WIN10系统如何关闭用户账户控制
在底部搜索框中输入UAC,打开用户账户控制设置 更改为从不通知即可
- Delphi与Windows 7下的用户账户控制(UAC)机制 及 禁用兼容性助手
WIN7, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统的操作可能无声的失败, ...
- Linux 用户管理和提权
Linux ⽀持多个⼈使⽤同⼀个⽤户登录系统, Windows 在修改组策略的情况下,也可以多个⼈使⽤同⼀个⽤户登录 远程连接Linux的⽅式:SSH协议 远程连接Windows的⽅式:RDP协议 安 ...
- linux系统安全及应用——账号安全(用户切换与提权)
一.su命令切换用户 su uesr 和 su - user 的区别:前者只切换登录人,shell环境还是上一个人的:后者表示注销当前用户,再进入新用户的shell. 查看切换记录:/var/log/ ...
- Delphi与Windows 7下的用户账户控制(UAC)机制
WIN7, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统的操作可能无声的失败, ...
- Delphi与Windows 7下的用户账户控制(UAC)机制(有可能需要取消enable runtime themes)
WIN7/WIN8/WIN10, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统 ...
- 不出现用户帐户控制-让Win7的用户账户控制(UAC)放过信任的程序
微软有个官方工具 Microsoft Application Compatibility Toolkit: http://www.microsoft.com/downloads/details.asp ...
随机推荐
- 【C/C++】引用&的含义/语法/作为函数参数/函数返回值/本质/常量引用
含义 引用不产生副本,只是给原变量起了别名. 对引用变量的操作就是对原变量的操作. 基本语法 数据类型 &别名 = 原名 e.g. int a = 10; int &b = a; // ...
- Mysql从头部署多个版本
目录 一.环境准备 二.下载安装包 三.Mysql-5.6单独部署 四.Mysql-5.7单独部署 五.添加到多版本控制 六.muliti使用 一.环境准备 系统:centos7.3一台 软件版本:m ...
- ORA-31633:unable to create master table "DP.SYS_EXPORT_FULL_11" ORA-01658
问题描述:在进行数据泵进行数据库备份的时候,但是导出命令报错,环境是19C 4节点的rac 一体机.目前磁盘空间需要清理,清理之前先备份一下数据库 ORA-31626:job does not exi ...
- Docker从入门到精通(五)——Dockerfile
Dockerfile 简单来说就是一个包含用于组合镜像的命令的文本文档,Docker 通过读取 Dockerfile 中的指令就可以按步骤生成镜像,那么在制作镜像之前,我们先了解一下镜像的原理. 1. ...
- 可视报表(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 原来一直有一个执念,做项目的人电脑上一定要安装Project软件,今天突然知道了,原来领导的电脑上,可以不装,因为,Pro ...
- CF706A Beru-taxi 题解
Content 有一个人在点 \((a,b)\) 等出租车.已知他周围共有 \(n\) 辆出租车,其中第 \(i\) 辆车在点 \((x_i,y_i)\) 上,速度为 \(v_i\).这个人想打能让他 ...
- More Effective C++ 基础议题(条款1-4)总结
More Effective C++ 基础议题(条款1-4)总结 条款1:仔细区别pointers和references 如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不指向(代表 ...
- shell脚本报错:.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录 这是因为shell脚本是Windows下编辑的 格式不一样 执行 sed -i 's/\r$//' 脚本名称.sh
- 【LeetCode】1415. 长度为 n 的开心字符串中字典序第 k 小的字符串 The k-th Lexicographical String of All Happy Strings of Le
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetcod ...
- 【LeetCode】636. Exclusive Time of Functions 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...