判断进程是否是“以管理员身份运行”:
/// @brief 判断进程是否以管理员身份运行
/// @param[in] dwProcessId : 进程ID
/// @param[in] bCurrentProcess : 是否是当前进程
/// @remark bCurrentProcess为true时,dwProcessId无效
/// @return 是管理员身份则返回true
bool IsRunAsAdministrator(DWORD dwProcessId, bool bCurrentProcess)
{
bool bIsElevated = false;
HANDLE hToken = NULL;
UINT16 uWinVer = LOWORD(GetVersion());
uWinVer = MAKEWORD(HIBYTE(uWinVer),LOBYTE(uWinVer));
if (uWinVer < 0x0600)//不是VISTA、Windows7
return (false);
do
{
HANDLE hProcess = NULL;
if (bCurrentProcess)
{
hProcess = GetCurrentProcess();
}
else
{
hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);
}
if (!hProcess)
{
bIsElevated = false;
break;
}
HANDLE hToken = NULL;
if (!::OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
{
bIsElevated = false;
::CloseHandle(hProcess);
break;
}
TOKEN_ELEVATION elevation;
DWORD dwRetLen = 0;
if (!::GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &dwRetLen))
{
bIsElevated = false;
::CloseHandle(hToken);
::CloseHandle(hProcess);
break;
}
if (dwRetLen == sizeof(elevation))
{
bIsElevated = elevation.TokenIsElevated;
}
::CloseHandle(hToken);
::CloseHandle(hProcess);
} while (false);
return bIsElevated;
}