![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск приложения из сервиса [D6, NT4, Win2k, WinXP]
Ученик © (2002-07-18 12:46:00)Есть интерактивный сервис, работающий по "Local system account" необходимо что бы сервис запустил приложение с именем пользователя, который сейчас зарегистрирован в системе, пароль пользователя неизвестен, т.е использовать CreateProcessAsUser нельзя, думаю использовать CreateRemoteThread, который будет создаваться для текущего работающего Shell-процесса и запускать требуемое приложение, может есть пути попроще ?
ZZ (2002-07-19 18:37:00) [1]RevertToSelf; "возвращает" старую учетную запись
т.е. теоретически код от ImpersonateLoggedOnUser до RevertToSelf под юзером. Остальное - под системой
Ученик (2002-07-19 17:05:00) [2]GetUserName(User,cbUser);
ShowMessage(User);
показывает то что требуется, а запущенное приложение через CreateProcess или WinExec в Task Manager под SYSTEM.
ZZ (2002-07-19 16:11:00) [3]Как бы это по проще... После вызова ImpersonateLoggedOnUser поток работает под аккаунтом юзера, токен которого был передан в функцию...
За 100% работоспособность примера не ручаюсь, писал его давно и вроде работал, а 2 раз проверять не хочется :))
procedure TForm1.Button1Click(Sender: TObject);
var
hProc : THandle;
hToken : THandle;
User : array [0..100] of Char;
cbUser : Cardinal;
begin
hProc:=OPenProcess(PROCESS_ALL_ACCESS,false,dwPid);
if hProc = 0 then
ShowMessage("OPenProcess"+#13#10+SysErrorMessage(GetLastError()));
if not OpenProcessToken(hProc,TOKEN_DUPLICATE or TOKEN_QUERY ,hToken)
then
ShowMessage("OpenProcessToken"+#13#10+SysErrorMessage(GetLastError()));
if not ImpersonateLoggedOnUser(hToken)
then
ShowMessage("ImpersonateLoggedOnUser"+#13#10+SysErrorMessage(GetLastError())
);
// Это проверка под кем мы работаем сейчас
cbUser:=100;
GetUserName(User,cbUser);
ShowMessage(User);
RevertToSelf;
cbUser:=100;
GetUserName(User,cbUser);
ShowMessage(User);
end;
Ученик (2002-07-19 10:34:00) [4]>ZZ
С ImpersonateLoggedOnUser не получилось, приложение запускалось под SYSTEM, это была работающая последовательность или предполагаемая ? Что должно происходить после вызова ImpersonateLoggedOnUser, описание я читал, но так и понял.
Удалось решить через CreateRemoteThread, работает как надо.
ZZ (2002-07-18 16:27:00) [5]Берем процесс
OpenProcess -> OpenProcessToken -> ImpersonateLoggedOnUser ->CreateProcess
-> CreateProcessAsUser
Какой процесс брать я думаю ты знаешь? Ты же хотел делать CreateRemoteThread. Можно, например, найти процесс explorer.exe
Ученик (2002-07-18 16:18:00) [6]>ZZ
В какой момент, и откуда его брать ?
ZZ (2002-07-18 16:03:00) [7]ImpersonateLoggedOnUser для того-же процесса :)