从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