在执行某些代码时(比如修改系统敏感文件)需要管理员权限。很多博客中关于申请管理员权限的函数在执行后会出现两个窗口,其中一个进程没有管理员权限。具体解决方案是关掉没有管理员权限的进程,可使用exit()函数实现。代码如下:
bool GetPrivilege()// 提权
{
CreateEvent(NULL, FALSE, FALSE, _T("{29544E05-024F-4BC1-A272-452DBC8E17A4}")); //用来创建或打开一个命名的或无名的事件对象
if (ERROR_SUCCESS != GetLastError())
{
return false;
}
else
{
TCHAR strPath[MAX_PATH] = { 0 };
HMODULE hModule = NULL;
GetModuleFileName(hModule, strPath, MAX_PATH);
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
sei.lpVerb = TEXT("runas");
sei.lpFile = strPath;
sei.nShow = SW_SHOWNORMAL;
if (!ShellExecuteEx(&sei)) //对指定应用程序运行某个操作
{
DWORD dwStatus = GetLastError();
if (dwStatus == ERROR_CANCELLED)
{
return false;
}
else if (dwStatus == ERROR_FILE_NOT_FOUND)
{
return false;
}
}
}
Sleep(100); // 防止退出的太早
exit(0); //退出没有管理员权限的进程
}
若要检测当前进程是否有管理员权限,可用下面所给出的代码:
bool IsProcessRunAsAdmin() //检查当前进程是否拥有管理员权限
{
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
BOOL b = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup);
if (b)
{
CheckTokenMembership(NULL, AdministratorsGroup, &b);
FreeSid(AdministratorsGroup);
}
return b == TRUE ;
}
附注:
第一个函数需要头文件
#include<windows.h>
#include<tchar.h>
第二个函数需要头文件
#include<windows.h>