2.1 Windows核心编程-进程UAC下以管理员权限运行

本文介绍了如何在Windows用户账户控制(UAC)环境下,使程序默认以管理员权限运行。通过修改VS工程属性或使用特定API如OpenProcessToken、GetTokenInformation等,实现以管理员权限启动程序或提升现有进程的权限。两种方法详细阐述了步骤和涉及的关键API,并指出权限提升过程中可能遇到的问题。
摘要由CSDN通过智能技术生成

从NT6.0开始,微软为了提高安全防护增加了非常多的新机制,其中对普通用户层开发人员影响最大的就是”用户账户控制系统(User Account Control , UAC)”

如果想让自己的程序默认以指定权限运行,可以通过修改VS工程的属性来达到目地:[属性]>[链接器]>[清单文件]>[UAC执行级别]

说明
requireAdministrator 应用程序须以管理员权限运行否则拒绝运行
highestAvailable 应用程序以当前可用的最高权限运行
如果当前用户为管理员,则弹出提示框
如果当前用户为普通用户,则不会提示
asInvoker 应用程序以与主调应用程序相同的权限启动

方法一

以管理员权限启动程序:

SHELLEXECUTEINFO sei = {
  sizeof(SHELLEXECUTEINFO)};
//请求提高权限
sei.lpVerb = TEXT("runas");
//需要提升权限的应用程序
sei.lpFile = TEXT("cmd.exe");

sei.nShow = SW_SHOWNORMAL;

if (!ShellExecuteEx(&sei)){
    DWORD dwStatus = GetLastError();
    if (dwStatus == ERROR_CANCELLED) {
        printf("ShellExecute Cancel..");
    }
    else if(dwStatus == ERROR_FILE_NOT_FOUND)
    {
        printf("File Not Found");
    }
}

以管理员权限启动进程步骤(注:进程启动的权限,在进程启动前已经设置好,所以程序启动之后,已经有启动权限了):
1. 打开当前进程的令牌
2. 查看当前进程是否具有管理员权限
3. 如果无管理员权限,则以管理员权限重新启动本进程

#include <Windows.h>
#include <ShlObj.h>
bool runAsAdmin()
{
    //1. 获取进程令牌
    HANDLE hToken = NULL;
    if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken) )
        return false;
    //2. 获取提升类型
    TOKEN_ELEVATION_TYPE ElevationType = TokenElevationTypeDefau
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值