FlyingPig

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

摘抄了 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;
	}
}
posted on 2011-01-21 15:23  nrj  阅读(571)  评论(0编辑  收藏  举报