Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: CL | DM;

Вниз

Запуск приложения из сервиса   Найти похожие ветки 

 
Ученик   (2002-07-18 12:46) [0]

Есть интерактивный сервис, работающий по "Local system account" необходимо что бы сервис запустил приложение с именем пользователя, который сейчас зарегистрирован в системе, пароль пользователя неизвестен, т.е использовать CreateProcessAsUser нельзя, думаю использовать CreateRemoteThread, который будет создаваться для текущего работающего Shell-процесса и запускать требуемое приложение, может есть пути попроще ?


 
ZZ ©   (2002-07-18 16:03) [1]

ImpersonateLoggedOnUser для того-же процесса :)


 
Ученик   (2002-07-18 16:18) [2]

>ZZ
В какой момент, и откуда его брать ?


 
ZZ ©   (2002-07-18 16:27) [3]

Берем процесс
OpenProcess -> OpenProcessToken -> ImpersonateLoggedOnUser ->CreateProcess
-> CreateProcessAsUser

Какой процесс брать я думаю ты знаешь? Ты же хотел делать CreateRemoteThread. Можно, например, найти процесс explorer.exe


 
Ученик   (2002-07-19 10:34) [4]

>ZZ
С ImpersonateLoggedOnUser не получилось, приложение запускалось под SYSTEM, это была работающая последовательность или предполагаемая ? Что должно происходить после вызова ImpersonateLoggedOnUser, описание я читал, но так и понял.

Удалось решить через CreateRemoteThread, работает как надо.


 
ZZ ©   (2002-07-19 16:11) [5]

Как бы это по проще... После вызова 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 17:05) [6]

GetUserName(User,cbUser);
ShowMessage(User);

показывает то что требуется, а запущенное приложение через CreateProcess или WinExec в Task Manager под SYSTEM.


 
ZZ ©   (2002-07-19 18:37) [7]

RevertToSelf; "возвращает" старую учетную запись
т.е. теоретически код от ImpersonateLoggedOnUser до RevertToSelf под юзером. Остальное - под системой



Страницы: 1 вся ветка

Текущий архив: 2002.09.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-98098
Metotrone
2002-09-19 18:49
2002.09.30
Закрытие приложения


1-98151
Shrek
2002-09-17 17:21
2002.09.30
Помогите с буфером!


14-98293
Сатир
2002-09-03 19:01
2002.09.30
---|Ветка была без названия|---


1-98168
Svin
2002-09-17 08:40
2002.09.30
StringGrid ????


3-97987
MeryF
2002-09-09 16:33
2002.09.30
Вопрос по работе с DBGrid