Home Page

使用到的系统函数

OpenProcessTokenLookupPrivilegeValueWAdjustTokenPrivileges

BOOL
WINAPI
OpenProcessToken(				//打开与进程相关联的访问令牌
    _In_ HANDLE ProcessHandle,	//所要提升进程的句柄
    _In_ DWORD DesiredAccess,	//选择所要操作的类型,指定请求的访问令牌访问类型
    _Outptr_ PHANDLE TokenHandle//返回的访问令牌句柄的指针
    );
    
BOOL
WINAPI
LookupPrivilegeValueW(	//查看系统权限的特权值
    _In_opt_ LPCWSTR lpSystemName,	//所要被检索特权值的系统的名称,
    								//如果指定了空字符串,则该函数尝试在本地系统上查找特权名称。
    _In_     LPCWSTR lpName,		//索要检索的特权名称
    _Out_    PLUID   lpLuid			//指向接收LUID的变量的指针,
    								//通过该LUID可以在lpSystemName参数指定的系统上得到特权。
    );
    
BOOL
WINAPI
AdjustTokenPrivileges(	//在指定的访问令牌上启用或禁用特权
    _In_ HANDLE TokenHandle,			//访问令牌句柄
    _In_ BOOL DisableAllPrivileges,		//是否禁用令牌的所有特权
    _In_opt_ PTOKEN_PRIVILEGES NewState,//指向TOKEN_PRIVILEGES结构的指针,
    									//该结构指定特权及其属性的数组。
    									//如果DisableAllPrivileges参数为FALSE,则 
    									//AdjustTokenPrivileges 函数启用,
    									//禁用或删除令牌的这些特权。
    _In_ DWORD BufferLength,			//PreviousState的缓冲区大小
    _Out_writes_bytes_to_opt_(BufferLength,*ReturnLength) PTOKEN_PRIVILEGES PreviousState,
    _Out_opt_ PDWORD ReturnLength
    );

代码

bool UpPrivilegeValue()
{
	//OpenProcessToken()函数用来打开与进程相关联的访问令牌
	HANDLE hToken = nullptr;
	if (FALSE == OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
	{
		return false;
	}
	//LookupPrivilegeValue()函数查看系统权限的特权值
	LUID luid;
	if (FALSE == LookupPrivilegeValue(nullptr, SE_DEBUG_NAME, &luid))
	{
		CloseHandle(hToken);
		return false;
	}
	//调整权限设置
	TOKEN_PRIVILEGES Tok;
	Tok.PrivilegeCount = 1;
	Tok.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	Tok.Privileges[0].Luid = luid;
	if (FALSE == AdjustTokenPrivileges(hToken, FALSE, &Tok, sizeof(Tok), nullptr, nullptr))
	{
		CloseHandle(hToken);
		return false;
	}

	if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
	{
		CloseHandle(hToken);
		return false;
	}

	CloseHandle(hToken);
	return true;
}

Q.E.D.