#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
提权方式启动进程和以当前用户token启动进程
最新推荐文章于 2022-08-12 17:43:13 发布
本文探讨了两种启动进程的方法:一种是以提权方式启动,另一种是利用当前用户的token。提权启动通常涉及到更高权限的操作,而使用当前用户token则遵循最小权限原则。这两种方式各有其应用场景,理解它们的工作原理对于系统管理和安全至关重要。
摘要由CSDN通过智能技术生成