Подскажите как реализовать такое вот: 1) Имеется процесс с правами SYSTEM (обычная служба) 2) Из этой службы необходимо запускать другие программы, но с правами залогиневшегося пользователя. При этом пароль и логин неизвестны. т.е. стандартный SVCHOST это каким-то образом умеет делать. Вообще в какую сторону копать? Допустим я смогу найти PID Explorer'a залогиневшегося пользователя, затем открыть его и получить Токены, а потом как-то ими манипулировать, чтобы запустить процесс от этого пользователя? Inject не предлагать! Пробовал использовать ImpersonateLoggedOnUser. Вроде всё нормально. GetUserNameA Возвращает имя нужного пользователя а не SYSTEM, но вот если запустить процесс, то он запустится всё равно от SYSTEM
Кстати, но это не решило проблему! Программа хоть и запускается от пользователя другова, но поведение её становится странным. К примеру Если запустить FireFox, то он начинает себя вести совершенно по другому, как будто он запущен от другова пользователя (нет вкладок/закладок/истории) т.е. переменные окружения остались такие же как и у системного процесса. Всё проблема решена, создание блока переменных окружения на основе токина)
> поведение её становится странным. LoadUserProfile (http://msdn.microsoft.com/en-us/library/bb762281(v=vs.85).aspx). А так вот небольшой код, имперсонацию потока надо заменить запуском процесса: Код (Text): BOOL SetThreadTokenAsUser() { HKEY hReg = 0;; CHAR ShellPath[MAX_PATH]; DWORD Temp; HANDLE hSnap = 0, hProc = 0, hToken = 0, hDup = 0; PROCESSENTRY32 Proc = {0}; TOKEN_PRIVILEGES Token = {0}; BOOL Result = FALSE; do { if (RegOpenKey(HKEY_LOCAL_MACHINE, "software\\microsoft\\windows nt\\currentversion\\winlogon", &hReg) != ERROR_SUCCESS) { break; } Temp = MAX_PATH; if (RegQueryValueEx(hReg, "Shell", 0, 0, (LPBYTE)ShellPath, &Temp) != ERROR_SUCCESS) { break; } hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == INVALID_HANDLE_VALUE) { break; } Proc.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hSnap, &Proc)) { break; } Temp = 0; do { if (StrStrI(Proc.szExeFile, ShellPath)) { Temp = Proc.th32ProcessID; break; } } while (Process32Next(hSnap, &Proc)); if (!Temp) { break; } hProc = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, Temp); if (!hProc) { break; } if (!OpenProcessToken(hProc, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ADJUST_PRIVILEGES, &hToken)) { break; } if (!LookupPrivilegeValue(0, SE_IMPERSONATE_NAME, (PLUID)&Token.Privileges[0].Luid)) { break; } Token.PrivilegeCount = 1; Token.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken, FALSE, &Token, 0, 0, 0)) { break; } if (!DuplicateToken(hToken, SecurityImpersonation, &hDup)) { break; } Result = ImpersonateLoggedOnUser(hDup); } while (FALSE); if (hReg) { RegCloseKey(hReg); } if (hSnap) { CloseHandle(hSnap); } if (hProc) { CloseHandle(hProc); } if (hToken) { CloseHandle(hToken); } if (hDup) { CloseHandle(hDup); } return Result; }