系统环境块,又是一个深坑
又是史前巨坑级别。维护服务代码的时候,发现里面有一个常用的CreateProcessAsUser。本来这个功能用在其他地方啥事没有,这一天我突然接到一个需求,要调用一个只能在用户权限运行的程序。本来获取User token,再Create Process一气呵成。跟踪一下却有些蹊跷
卧槽这什么鬼,明明是当前用户起来的,仔细看了代码,果不其然,lpEnviroment用的是NULL,使用父进程的Enviroment,然而父进程是SYSTEM起的。
某智能Handle类 hDumpToken;
if (!DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDumpToken))
{
return;
}
LPVOID lpEnvironmentBlock = NULL;
if (!CreateEnvironmentBlock(&lpEnvironmentBlock, hDumpToken, FALSE))
{
return;
}
BOOL ret = CreateProcessAsUserW(hDumpToken, NULL,
(LPWSTR)strFile.c_str(),
NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, lpEnvironmentBlock, NULL,
&si, &pi);
wtf。