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;
}