CreateProcessAsUser()的使用

使用用户凭据创建进程并执行特定操作
本文介绍了一种方法,通过使用当前用户的令牌,利用WTSGetActiveConsoleSessionId、ImpersonateLoggedOnUser和CreateProcessAsUser等API来启动进程,并执行特定任务如清理磁盘缓存。
        HANDLE hToken = NULL;
	TCHAR szUsername[MAX_PATH];
	TCHAR para[MAX_PATH] = {0};
	TCHAR szUsernamePath[MAX_PATH];
	DWORD dwUsernameLen = MAX_PATH;
	DWORD cursessionid;
	cursessionid = WTSGetActiveConsoleSessionId();
	log_error("WTSGetActiveConsoleSessionId() = %d\n",cursessionid);
	if(!WTSQueryUserToken(cursessionid, &hToken))
	{
		log_error("%s WTSQueryUserToken is failed\n", __FUNCTION__);
	}
	if(!ImpersonateLoggedOnUser(hToken))
	{
		log_error("%s ImpersonateLoggedOnUser is failed\n", __FUNCTION__);
	}
	DWORD UsernamePathSize = ARRAYSIZE(szUsernamePath);
	//获取到当前用户路径
	if (!GetUserProfileDirectory(hToken,szUsernamePath,&UsernamePathSize))
	{
		log_error("%s GetUserProfileDirectory is failed\n", __FUNCTION__);
	}
        BOOL bResult = FALSE;
	PROCESS_INFORMATION pi;
	PSID                psid;
	STARTUPINFO         si;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb        = sizeof(STARTUPINFO);
	si.lpDesktop = L"winsta0\\default";
	// 
	// start the process
	//
	LPVOID environment;
	BOOL blockRet = CreateEnvironmentBlock(&environment, hToken, FALSE);
	if (!blockRet)
	{
		log_error("could not create environment block (error: %i)",
			GetLastError());
	}
	else
	{
		//TCHAR Cmdline[MAX_PATH] = _T("/c \"C:\\Windows\\System32\\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8\"");
		TCHAR Cmdline[MAX_PATH] = _T("/c \"C:\\Windows\\System32\\cleanmgr\" /sagerun:100");
		DWORD creationFlags = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;

		bResult = CreateProcessAsUser(
			hToken,
			_T("C:\\Windows\\System32\\CMD.exe"),
			Cmdline,//_T("InetCpl.cpl,ClearMyTracksByProcess 8"),//L"\"inetcpl.cpl,clearmytracksbyprocess 8\"",
			//L"/c \"C:\\Windows\\System32\\cleanmgr\" /sagerun:100",
			NULL,
			NULL,
			FALSE,
			creationFlags,
			environment,
			NULL,
			&si,
			&pi
			);
		log_error("CreateProcessAsUser0 = %d",GetLastError());

		// 
		// close the handles
		// 
		if (bResult && pi.hProcess != INVALID_HANDLE_VALUE) 
		{ 
			WaitForSingleObject(pi.hProcess, INFINITE); 
			CloseHandle(pi.hProcess); 
		} 
		else
		{
			log_error("CreateProcessAsUser1 = %d",GetLastError());
		}
		if (pi.hThread != INVALID_HANDLE_VALUE)
			CloseHandle(pi.hThread);
		 DestroyEnvironmentBlock(environment);
	}

	RevertToSelf();
	CloseHandle(hToken);  

CreateProcessAsUser函数在Windows操作系统中用于在指定用户的安全上下文中创建新进程。在使用此函数时,若程序需与用户互动,而用户帐户对互动式window站台及预设桌面无存取权,系统呼叫该函数会失败[^1]。 以下是使用该函数需要了解的一些要点: - **功能用途**:该函数可在指定用户的环境下创建新进程,适用于需要在不同用户权限下运行程序的场景,对于实现高级的权限管理和应用程序安全至关重要,为在Windows平台上开发复杂、安全性高的应用程序提供支持[^1][^2]。 - **使用注意事项**:当在目前没有与系统互相作用的使用者环境下建立程序,且程序需要与用户互动时,要确保用户帐户对互动式window站台及预设桌面有存取权,否则系统调用该函数会失败[^1]。 虽然没有直接给出CreateProcessAsUser函数的代码示例,但可以参考相关涉及Windows系统进程管理和权限控制的代码编写模式。例如,在设置文件的低完整性时,会涉及到一系列权限和描述符的操作,代码示例如下: ```cpp #include <sddl.h> // 要对低完整性设置的 LABEL_SECURITY_INFORMATION SDDL SACL #define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)" BOOL b = TRUE; DWORD dwErr = ERROR_SUCCESS; PSECURITY_DESCRIPTOR pSD = NULL; PACL pSacl = NULL; // 未分配 BOOL fSaclPresent = FALSE; BOOL fSaclDefaulted = FALSE; LPCWSTR pwszFileName = "Sample.txt"; b = ConvertStringSecurityDescriptorToSecurityDescriptorW( LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL); b = GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted); // 请注意,psidOwner、psidGroup 和 pDacl 均为 NULL // 并设置新的 LABEL_SECURITY_INFORMATION dwErr = SetNamedSecurityInfoW((LPWSTR) pwszFileName, SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值