提权方式启动进程和以当前用户token启动进程

本文探讨了两种启动进程的方法:一种是以提权方式启动,另一种是利用当前用户的token。提权启动通常涉及到更高权限的操作,而使用当前用户token则遵循最小权限原则。这两种方式各有其应用场景,理解它们的工作原理对于系统管理和安全至关重要。
摘要由CSDN通过智能技术生成
#include <Userenv.h>
#include <Psapi.h>
#include <TlHelp32.h>

#pragma comment(lib, "Userenv.lib")
#pragma comment(lib, "psapi.lib")

/************************************************************************/
/* 
* 函数名称: @StartAsAdmin
* 作    者: fzuim
* 功    能: 使用提权的方式创建进程(权限和uac相当)
* 参    数: 
* 返 回 值: 
* 创建日期: 2019/4/17
* 修改记录:
* 
*/
/************************************************************************/
BOOL CPubFunc::StartAsAdmin( LPCTSTR v_szProcessName, LPCTSTR v_szParam, WORD v_wShowWindow, PROCESS_INFORMATION* v_pmProcess /*= NULL*/ )
{
	HANDLE hToken = NULL;
	HANDLE hTokenDup = NULL;

	if (v_szProcessName == NULL) {
		return FALSE;
	}

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
	{
		return FALSE;
	}

	if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityAnonymous, TokenPrimary, &hTokenDup))
	{
		CloseHandle(hToken);
		return FALSE;
	}

	DWORD dwSessionId = CPubFunc::MyWTSGetActiveConsoleSessionId(); //WTSGetActiveConsoleSessionId();
	if (dwSessionId == 0xFFFFFFFF)
	{
		CloseHandle(hToken);
		return FALSE;
	}

	if (!SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD)))
	{
		CloseHandle(hToken);
		CloseHandle(hTokenDup);
		return FALSE;
	}

	STARTUPINFO si;
	LPVOID pEnv = NULL;

	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = _T("WinSta0\\Default");
	si.wShowWindow = v_wShowWindow;
	si.dwFlags = STARTF_USESHOWWINDOW;

	if (!CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE))
	{
		CloseHandle(hToken);
		CloseHandle(hTokenDup);
		re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值