I am trying to do my current process, which rises to restart the explorer using a standard user token.
What I do, first I start the main process as an administrator, and then take a snapshot of the work:
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);
then as soon as I get the PID of the explorer, which works under the standard user account, I call:
OpenProcessToken(hProcess,TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE ,&hPToken))
then I call:
ImpersonateLoggedOnUser(hPToken);
and finally, I taskkill explorer.exe, and the shell will execute it again, but it works under administrator privileges.
As if impersonateLoggedonUser is not working. Although its return is true and GetLastError () returns 0;
I also tried using CreateProcessAsUser (), but this always gives 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 );
Any ideas or suggestions.