【Windows原理】权限管理-获取令牌

// 05.权限管理_令牌的获取-复习.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <shlobj.h>

// 复杂版
bool IsRunAsAdmin(bool &bFullToken);

// 简化版
bool IsRunAsAdmin_Simple();

int _tmain(int argc, _TCHAR* argv[])
{
	bool bIsFullToken = false;
	if (IsRunAsAdmin(bIsFullToken))
	{
		if (bIsFullToken)
		{
			printf("管理员权限运行!\n");
		}
		else
		{
			printf("非管理员权限运行!\n");
		}
	}

	system("pause");
	return 0;
}


bool IsRunAsAdmin(bool &bFullToken)
{
	// 1. 获取本进程的令牌
	HANDLE hToken = NULL;
	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))return false;

	// 2. 获取提升类型
	TOKEN_ELEVATION_TYPE ElevationType = TokenElevationTypeDefault;
	BOOL bIsAdmin = FALSE;
	DWORD dwSize = 0;

	if (GetTokenInformation(hToken, TokenElevationType, &ElevationType, sizeof(TOKEN_ELEVATION_TYPE), &dwSize))
	{
		// 2.1 创建管理员组的对应SID
		BYTE adminSID[SECURITY_MAX_SID_SIZE];
		dwSize = sizeof(adminSID);
		CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, &adminSID, &dwSize);
		
		// 2.2 判断当前进程运行用户角色是否为管理员
		if (ElevationType == TokenElevationTypeLimited)
		{
			// A. 获取受限令牌的提供者的令牌
			HANDLE hUnfilteredToken = NULL;
			GetTokenInformation(hToken, TokenLinkedToken, (PVOID)&hUnfilteredToken,sizeof(HANDLE),&dwSize);

			// B. 检查这个原始的令牌是否包含管理员SID
			if (!CheckTokenMembership(hUnfilteredToken, &adminSID, &bIsAdmin))
				bIsAdmin = FALSE;
			CloseHandle(hUnfilteredToken);
		}
		else
		{
			bIsAdmin = IsUserAnAdmin();
		}
		CloseHandle(hToken);

	}

	// 3. 判断具体权限状况
	bFullToken = FALSE;
	switch (ElevationType)
	{
	case TokenElevationTypeDefault:
		// 默认的用户或UAC被禁用
		if (bIsAdmin)
			// 默认用户有管理员权限
			bFullToken = true;
		else 
			// 默认用户不是管理员组
			bFullToken = false;
		break;
	case TokenElevationTypeFull:
		// 已经成功提高进程权限
		if (bIsAdmin) 
			// 当前以管理员权限运行
			bFullToken = true; 
		else 
			// 当前未以管理员权限运行
			bFullToken = false;
		break;

	case TokenElevationTypeLimited:
		// 进程在受限的权限下运行
		if (bIsAdmin)
			// 用户有管理员权限,但是进程权限有限
			bFullToken = false;
		else
			// 用户不是管理员组,且进程权限有限
			bFullToken = false;
		break;
	}

	return true;

}


bool IsRunAsAdmin_Simple()
{
	// 默认不是运行在管理员权限下
	bool bFullToken = false;
	// 1. 获得本进程的令牌
	HANDLE hToken = NULL;
	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
	{
		return false;
	}

	// 2. 获取提升类型
	TOKEN_ELEVATION_TYPE ElevationType = TokenElevationTypeDefault;
	BOOL bIsAdmin = false;
	DWORD dwSize = 0;
	GetTokenInformation(hToken, TokenElevationType, &ElevationType, sizeof(TOKEN_ELEVATION_TYPE), &dwSize);

	// 3. 判断权限情况
	switch (ElevationType)
	{
		// 默认的用户或UAC被禁用
	case TokenElevationTypeDefault:
		// 已经成功提高进程权限
	case TokenElevationTypeFull:
		if (IsUserAnAdmin())
			// 默认用户有管理员权限	
			bFullToken = true;
		else
			// 默认用户不是管理员组
			bFullToken = false;
		break;
	}
	return bFullToken;
}

 

文 / luna
LEAVE A REPLY

loading