Я пытаюсь запустить мой процесс, который повышен до перезапуска проводника, используя стандартный токен пользователя.
Сначала я запускаю основной процесс как администратор, а затем делаю снимок запуска:
if (Process32First(hSnapshot,&pe32))
{
do
{
if (!wcsicmp(pe32.szExeFile, L"explorer.exe"))
{
DWORD dwExplorerSessId = 0;
if (ProcessIdToSessionId(pe32.th32ProcessID, &dwExplorerSessId) && dwExplorerSessId == dwSessionId)
{
dwExplorerLogonPid = pe32.th32ProcessID;
break;
}
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
затем, как только я получу PID explorer, который работает под стандартной учетной записью пользователя, я звоню:
OpenProcessToken(hProcess,TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE
,&hPToken))
тогда я звоню:
ImpersonateLoggedOnUser(hPToken);
и, наконец, я taskkill explorer.exe и оболочка выполняет его снова, но он запускается с правами администратора.
Как будто impersonateLoggedonUser не работает. Хотя он возвращает true, а GetLastError () возвращает 0;
Я также пытался использовать CreateProcessAsUser (), но это всегда дает ERROR_FILE_NOT_FOUND:
STARTUPINFO si;
GetStartupInfo(&si);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
TCHAR tchcmd[MAX_PATH];
_tcscpy(tchcmd, _T("explorer.exe"));
PVOID penv;
CreateEnvironmentBlock(&penv, hToken, FALSE);
HANDLE hNewToken;
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenImpersonation, &hNewToken);
CreateProcessAsUser(, NULL, tchcmd, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, penv, 0, &si, &pi );
Любые идеи или предложения.