VC程序执行时自动请求以管理员权限执行

本文介绍如何通过Visual Studio的项目属性设置UAC执行级别为requireAdministrator, 以确保应用程序拥有管理员权限运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过VS项目属性进行设置

项目属性-链接器-清单文件-UAC执行级别-requireAdministrator (/level='requireAdministrator')

Property-Linker-Manifest File-UAC Execution Level-requireAdministrator (/level='requireAdministrator')


转自:https://blog.youkuaiyun.com/whatday/article/details/39403199

VC6(Visual C++ 6.0)环境中开发的程序如果需要获取系统管理员权限,通常有两种常见的方式实现:一是通过提升进程自身的权限;二是创建一个新的以管理员身份运行的进程。然而需要注意的是,由于VC6比较古老,并且其本身并不直接支持UAC(用户账户控制),因此现代操作系统如Windows Vista及之后版本引入了更严格的权限管理机制。 下面分别介绍这两种方法的具体步骤以及注意事项: ### 方法一:请求管理员权限(适用于较新版本的操作系统) 对于Windows XP之前的老式系统来说,默认所有用户都拥有较高权限,而在Vista及以上版本,则需要显式的请求管理员权限才能执行某些敏感操作。 您可以在manifest文件中指定应用程序所需的最低权限级别为requireAdministrator即可完成这一需求: ```xml <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly> ``` 然后将此清单嵌入到您的exe可执行文件内。(请注意这种方法仅能作用于具有现代特性支持的新版Winows) --- ### 方法二:手动启动一个带高权限的应用程序实例 另一种方式是在普通权限下检测自身是否已获得足够的权利来进行特定任务。如果没有足够权限的话就尝试重新以最高特权的身份再次打开自己或其他相关工具软件来达到目标效果的目的。以下是代码片段演示如何判断当前线程是否具备Admin级别的Token并据此作出相应处理措施的例子: ```cpp #include <windows.h> #include <tchar.h> #include <stdio.h> BOOL IsUserAnAdmin() { PSID pAdministratorsGroup = NULL; SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; if (!AllocateAndInitializeSid( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdministratorsGroup)) return FALSE; BOOL bIsAdmin = FALSE; if (!CheckTokenMembership(NULL, pAdministratorsGroup, &bIsAdmin)) { bIsAdmin = FALSE; } FreeSid(pAdministratorsGroup); return bIsAdmin ? TRUE : FALSE; } void RelaunchAsAdmin(LPCWSTR szAppPath) { SHELLEXECUTEINFO sei = { sizeof(sei) }; sei.lpVerb = L"runas"; sei.lpFile = szAppPath; sei.nShow = SW_NORMAL; ShellExecuteEx(&sei); } int _tmain(int argc, TCHAR *argv[]) { if(!IsUserAnAdmin()) { // 当前不是管理员则重启本程序要求管理员权限 RelaunchAsAdmin(GetCommandLineW()); printf("Please run this program as Administrator...\n"); return -1; } // 管理员模式下的正常业务逻辑... printf("Running with elevated privileges!\n"); getchar(); return 0; } ``` 上面这个例子首先检查现有的会话里有没有属于“管理员组”的SID存在。如果有说明此此刻已经是以超级用户的形态登录进来了那么就可以继续往下走正常的流程路径啦~ 否则它就会调用ShellExecute函数带上参数verb设成”runas“, 这样就能弹框询问用户要不要给予更高一级别的访问许可咯~ **重要提示:** 强烈建议只针对确实必要的功能申请提权而不是整个应用全程保持高位运行状态哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值