Window:进程操作

1、获取当前进程名称

TCHAR szFileFullPath[256];
::GetModuleFileName(NULL, static_cast<LPTSTR>(szFileFullPath), 256);
tstring wstrProcessName(szFileFullPath);
if (!wstrProcessName.empty())
{
	int nPos = wstrProcessName.find_last_of(_T('\\'));
	int nLen = wstrProcessName.length();
	wstrProcessName = wstrProcessName.substr(nPos + 1,nLen);
}

2、在System权限降权读取appdata目录。

TCHAR wszAppDataPath[MAX_PATH * 2] = { 0 };
::SHGetSpecialFolderPath(NULL, wszAppDataPath, CSIDL_APPDATA, TRUE);
HANDLE hToken = NULL;
if(true == ImpersonateLoggedOnUserWrapper(hToken))
{
	if (S_OK == SHGetFolderPath(NULL, CSIDL_APPDATA, hToken, SHGFP_TYPE_DEFAULT, wszAppDataPath))
	{
		//使用完毕之后通过调用RevertToSelf取消模拟
		RevertToSelf();
	}
}

//对当前用户权限降权以普通用户执行
bool ImpersonateLoggedOnUserWrapper(HANDLE& hToken)
{
	DWORD dwConsoleSessionId = WTSGetActiveConsoleSessionId();
	if (WTSQueryUserToken(dwConsoleSessionId, &hToken))
	{
		if (ImpersonateLoggedOnUser(hToken))
		{
			return true;
		}
	}
	return false;
}

3、判断进程是否存在

bool FindProcess(std::wstring wstrExeName)
{
	PROCESSENTRY32 my;
	HANDLE l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (((int)l) != -1) {
		my.dwSize = sizeof(my);
		if (Process32First(l, &my)) {
			do
			{
				_tcsupr(my.szExeFile);
				if (_tcsicmp(my.szExeFile, wstrExeName.c_str()) == 0) {
					CloseHandle(l);
					return true;
				}
			} while (Process32Next(l, &my));
		}
		CloseHandle(l);
	}
	return false;
}

4、启动指定的进程,隐藏进程窗口

//path:启动的进程路径
PROCESS_INFORMATION pi;
STARTUPINFOW si;      //隐藏进程窗口,启动进程
si.cb = sizeof(STARTUPINFOW);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.cbReserved2 = NULL;
si.lpReserved2 = NULL;
pi.hProcess = NULL;
BOOL ret = CreateProcessW(NULL, (LPWSTR)path.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
HANDLE hProcess = pi.hProcess;
if (hProcess != 0) {
	CloseHandle(hProcess);
}

5、以管理员权限启动指定的进程,隐藏进程窗口

//wstrPath:进程的本地路径
//nShowType:窗口的展示类型,SW_SHOW or SW_HIDE
//wstrDirectory:文件目录,可为空
//wstrParam:启动进程所带的传参
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = TEXT("runas");
sei.lpFile = wstrPath.c_str();
sei.lpDirectory = wstrDirectory.c_str();
sei.nShow = nShowType;
sei.lpParameters = wstrParam.c_str();
if (!ShellExecuteEx(&sei)){
return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾荒的小海螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值