摘抄了 Windows via C/C++ 上的一段代码,一个函数——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; } }