最近写程序时遇到一个问题,就是当一个程序需要管理员权限才能正常运行该怎么办?

通过查阅多方资料,我总结出来几个比较实用的办法(每种办法实现方法不同,同时功能上也有一些小小的差异)

方法一(批处理脚本)

@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" ;你的代码写在这里,你可以在在这里启动你的程序

这个批处理脚本代码可以以管理员身份启动,并且会以文件所在位置为工作环境。

所以,只要用这个脚本启动你的程序即可以管理员身份启动你的程序。

缺点:

  1. 会有一个命令提示符窗口一闪而过;
  2. 程序启动入口是个批处理文件。

方法二(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用户账户控制 (提权)的更多相关文章

  1. Win8系统如何关闭用户账户控制UAC

    按WIN+S,屏幕右侧出现搜索框,在搜索框中输入UAC,然后单击"更改用户账户控制设置"   然后把弹出的窗口改成"从不通知"就可以了  

  2. win7如何设置某个软件不弹出用户账户控制

    手动修改注册表: 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面 ...

  3. WIN10系统如何关闭用户账户控制

    在底部搜索框中输入UAC,打开用户账户控制设置   更改为从不通知即可

  4. Delphi与Windows 7下的用户账户控制(UAC)机制 及 禁用兼容性助手

    WIN7, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统的操作可能无声的失败, ...

  5. Linux 用户管理和提权

    Linux ⽀持多个⼈使⽤同⼀个⽤户登录系统, Windows 在修改组策略的情况下,也可以多个⼈使⽤同⼀个⽤户登录 远程连接Linux的⽅式:SSH协议 远程连接Windows的⽅式:RDP协议 安 ...

  6. linux系统安全及应用——账号安全(用户切换与提权)

    一.su命令切换用户 su uesr 和 su - user 的区别:前者只切换登录人,shell环境还是上一个人的:后者表示注销当前用户,再进入新用户的shell. 查看切换记录:/var/log/ ...

  7. Delphi与Windows 7下的用户账户控制(UAC)机制

    WIN7, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统的操作可能无声的失败, ...

  8. Delphi与Windows 7下的用户账户控制(UAC)机制(有可能需要取消enable runtime themes)

    WIN7/WIN8/WIN10, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统 ...

  9. 不出现用户帐户控制-让Win7的用户账户控制(UAC)放过信任的程序

    微软有个官方工具 Microsoft Application Compatibility Toolkit: http://www.microsoft.com/downloads/details.asp ...

随机推荐

  1. python实现skywalking的trace模块过滤和报警

    skywalking本身的报警功能,用起来视乎不是特别好用,目前想实现对skywalking的trace中的错误接口进行过滤并报警通知管理员和开发.所以自己就用python对skywalking做了二 ...

  2. 今天使用Bufferedrader ,单缓冲区的数据读取时出现的中文乱码的问题

    1.使用这种方式可能出现的中文乱码代码: /** * 第三套********:使用BufferReader,单缓冲区的数据读取和写入(字符输入流) * 读取 */ FileReader frFileR ...

  3. pyecharts简介

    一.概况 Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可. 而 Python 是一门富有表达力的语言,很适合用于数据处理.当数据分析遇上数据可 ...

  4. windows10 安装 Mysql8.0

    目录 1.Mysql8.0下载 2.配置环境变量 3.在安装目录下创建my.ini文件 4 初始化Mysql 5 安装至系统服务 6 更改密码 1.Mysql8.0下载 2.配置环境变量 将下载后文件 ...

  5. 解决电脑连接 iPhone 热点没有 IPv6地址的问题

    问题描述: 初入 iPhone ,电脑使用 ios 共享的热点无法连接 IPv6 地址.但是,直接在 iPhone 上面打开 https://www.test-ipv6.com/ 完美支持 IPv6 ...

  6. CF999C Alphabetic Removals 题解

    Content 给定一个长度为 \(n\) 的仅含小写字母的字符串,执行 \(k\) 次如下操作: 如果字符串中有 a 这个字母,删除从左往右第一个 a,并结束操作,否则继续操作: 如果字符串中有 b ...

  7. float浮动的详细总结

    float浮动的详细总结 1.定位方案 在css中,有4种常用的方法对元素进行定位和布局: normal flow:标准流.文档流: position:定位(relative.absolute.fix ...

  8. JAVA中json对象转JAVA对象,JSON数组(JSONArray)转集合(List)

    json格式 {userId:'1',message:'2',create_time:'2020-03-28 20:58:11',create_date:'2020-03-28'}JAVA对象 Cha ...

  9. Spring实现自定义注解并且配置拦截器进行拦截

    有时候我们会自定义注解,并且需要配置拦截器对请求方法含有该自定义注解的方法进行拦截操作 自定义注解类 NeedToken.java import java.lang.annotation.Docume ...

  10. c++内存分布之虚函数(多继承)

    系列 c++内存分布之虚函数(单一继承) c++内存分布之虚函数(多继承) [本文] 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...