您的位置:首页 > 其它

判断进程是否"以管理员身份运行"

2016-08-02 20:23 344 查看
判断进程是否是“以管理员身份运行”:

/// @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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: