Windows下权限上下文
<<Windows核心编程>>一书中第四章讲解UAC(用户账户控制)的时候,有一个函数GetProcessElevation能返回提升类型和一个指出进程是否正在以管理员身份运行的布尔值.
BOOL GetProcesElevation(TOKEN_ELEVATION_TYPE *pElevation, BOOL *pIsAdmin)
{
HANDLE hToken = NULL;
DWORD dwSize;
// 获得当前进程令牌
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
return FALSE;
BOOL b_Result = FALSE;
// 检索提升类型信息
if (GetTokenInformation(hToken, TokenElevationType, pElevation, sizeof(TOKEN_ELEVATION_TYPE), &dwSize))
{
if(*pElevation == TokenElevationTypeLimited)
{
// 创建 Administrator 组相应的 SID
BYTE adminSID[SECURITY_MAX_SID_SIZE];
dwSize = sizeof(adminSID);
CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, adminSID, &dwSize);
// 获得链接令牌的句柄
HANDLE hUnfilteredToken = NULL;
GetTokenInformation(hToken, TokenLinkedToken, (LPVOID)&hUnfilteredToken, sizeof(HANDLE), &dwSize);
// 检测令牌是否包含管理员SID
if(CheckTokenMembership(hUnfilteredToken, &adminSID, pIsAdmin))
b_Result = TRUE;
CloseHandle(hUnfilteredToken);
}else{
*pIsAdmin = IsUserAnAdmin();
b_Result = TRUE;
}
CloseHandle(hToken);
return b_Result;
}
}