在Windows系统中,当我们需要以其他用户的身份启动某些进程时,可以使用“createprocessasuser”函数来实现这一操作。它可以在当前计算机或者运行的系统内以指定的用户身份创建一个新的进程。本篇文章将带大家了解如何使用该函数进行进程启动。
1. 创建进程的基本原理
在Windows系统中,内核会根据用户的身份以一定的权限启动进程,这些进程会开始执行并且运行一段时间后终止。在此过程中,内核总是记录着和存储着进程的相关信息,比如进程ID、进程名以及权限等等。这些信息可以供调试人员和程序员进行进一步的分析和处理。
而使用“createprocessasuser”函数,便可以为指定的用户启动进程,也可以指定进程的名称和权限等。值得注意的是,该函数启动的进程会运行在指定用户的环境下,并且可以使用指定用户的权限进行操作。
2. “createprocessasuser”函数的使用
在开始使用该函数前,需要明确以下几个点:
(1)已获取目标用户的token信息;
(2)需要已经将token信息赋于当前的身份;
(3)在启动进程时,需要为函数传递一定的参数。
下面展示一段代码,进行进程启动的实现:
```C++
#include
#include
BOOL CreateProcessAsUserWrapper(
TCHAR* szCommandLine,
DWORD dwSessionId
)
{
BOOL bSuccess = FALSE;
HANDLE hToken = NULL, hDupToken = NULL, hProcess = NULL;
DWORD dwProcessId = 0;
PROCESS_INFORMATION pi = { 0 };
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCTHREADATTRIB pta[2] = { 0 };
DWORD dwSize = 0;
FILL_PROC_THREAD_ATTRIBUTE_LIST fpta =
(FILL_PROC_THREAD_ATTRIBUTE_LIST) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll"))
, "InitializeProcThreadAttributeList");
REQUIRE(fpta);
BOOL bRet = InitProcThreadAttributeList(NULL, 1, 0, &dwSize);
REQUIRE(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
REQUIRE(bRet == FALSE);
pta[0].Attribute = PROC_THREAD_ATTRIBUTE_PARENT_PROCESS;
pta[0].Size = sizeof(PROCTHREADATTRIB);
pta[0].Value = &hSnapshot;
bRet = InitProcThreadAttributeList(pta, 1, 0, &dwSize);
REQUIRE(bRet);
PVOID lpAttributeList = (PVOID) malloc(dwSize);
REQUIRE(lpAttributeList);
memset(lpAttributeList, 0, dwSize);
bRet = InitProcThreadAttributeList(lpAttributeList, 1, 0, &dwSize);
REQUIRE(bRet);
STARTUPINFOEX si = { 0 };
si.StartupInfo.cb = sizeof(STARTUPINFOEX);
si.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST) lpAttributeList;
HANDLE hImpersonationToken = NULL;
bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_IMPERSONATE, &hImpersonationToken);
REQUIRE(bRet);
bRet = DuplicateTokenEx(hImpersonationToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDupToken);
REQUIRE(bRet);
bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ASSIGN_PRIMARY|TOKEN_DUPLICATE, &hToken);
REQUIRE(bRet);
SECURITY_QUALITY_OF_SERVICE sqos = { sizeof(sqos) };
sqos.Length = sizeof(sqos);
sqos.ImpersonationLevel = SecurityImpersonation;
sqos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
sqos.EffectiveOnly = FALSE;
OBJECT_ATTRIBUTES oa = { sizeof(oa) };
oa.Length = sizeof(oa);
oa.SecurityQualityOfService = &sqos;
bRet = CreateProcessWithTokenW(
hDupToken,
0,
NULL,
szCommandLine,
CREATE_UNICODE_ENVIRONMENT,
NULL,
NULL,
&si.StartupInfo,
&pi
);
REQUIRE(bRet);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hToken);
CloseHandle(hDupToken);
CloseHandle(hImpersonationToken);
free(lpAttributeList);
return TRUE;
}
```
在使用该代码前,需要传入启动进程的名称,比如在该程序中表示为“szCommandLine”。
3. 总结
“createprocessasuser”函数是为程序员提供的一个强大工具,可以在Windows系统中以指定的用户身份启动进程,这对于某些需要获得某种特定权限的进程非常有用。通过使用该函数,我们可以在程序安全性和稳定性方面提供更多的保障。