WIndows via C/C++ 学习(12)权限上下文

摘抄了 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;

	}

}

你可能感兴趣的:(windows)