| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  | [Win32] CreateProcess из System Service?  30.11.03 00:00  Число просмотров: 1594 Автор: Killer{R} <Dmitry> Статус: Elderman
 Отредактировано 30.11.03 00:03  Количество правок: 1
 |  
| > Как известно системные сервисы не имеют интерактивности, то > есть очереди сообщений и окон.
 Почему это? Сервис может быть интерактивным для чего надо его создавать с флагом SERVICE_INTERACTIVE_PROCESS. Ну или галку выставить соответствующую в его настройках. А вообще если тебе нельзя указать этот  флаг то можешь попробовать запускать процесс через CreateProcess установив перед запуском
 STARTUPINFO si;si.lpDesktop="Default";
 |  | <programming> |  
| [Win32] CreateProcess из System Service?  29.11.03 17:40 Автор: Disappear Статус: Незарегистрированный пользователь
 |  
| У меня есть программка, которая запущена и работает как системный сервис WindowsNT Как известно системные сервисы не имеют интерактивности, то есть очереди сообщений и окон.
 
 Дело такое: мне нужно запустить чужую программу из моего сервиса,
 для этого я использую
 
 CreateProcess(ProgPathName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &ProcInfo);
 
 программа запускается, но она запускается тоже как системный процесс :( и поэтому глупо сидит в памяти и взаимодействавать с ней невозможно. Тоесть, не создается никаких окон, программа себя никак не проявляет.
 
 Как запустить программу независимо от моего системного сервиса???
 |  
|  | [Win32] CreateProcess из System Service?  30.11.03 00:00 Автор: Killer{R} <Dmitry> Статус: Elderman
 Отредактировано 30.11.03 00:03  Количество правок: 1
 |  
| > Как известно системные сервисы не имеют интерактивности, то > есть очереди сообщений и окон.
 Почему это? Сервис может быть интерактивным для чего надо его создавать с флагом SERVICE_INTERACTIVE_PROCESS. Ну или галку выставить соответствующую в его настройках. А вообще если тебе нельзя указать этот  флаг то можешь попробовать запускать процесс через CreateProcess установив перед запуском
 STARTUPINFO si;si.lpDesktop="Default";
 |  
|  |  | [win32] ту дело в system и user процессах  30.11.03 01:46 Автор: Disappear Статус: Незарегистрированный пользователь
 |  
| > > Как известно системные сервисы не имеют > интерактивности, то
 > > есть очереди сообщений и окон.
 > Почему это? Сервис может быть интерактивным для чего надо
 > его создавать с флагом SERVICE_INTERACTIVE_PROCESS. Ну или
 > галку выставить соответствующую в его настройках. А вообще
 > если тебе нельзя указать этот  флаг то можешь попробовать
 > запускать процесс через CreateProcess установив перед
 > запуском
 > STARTUPINFO si;si.lpDesktop="Default";
 Это все не помогает.
 Дело в том, что новый процесс создается как системный, хотя обыкновенные программы запускаются под правами текущего пользователе ( в моем случае админа).
 В TaskManagere видно, что запущены системные и юзерские процессы.
 
 Я так понял, что проблема решится если использовать функцию
 CreateProcessWithLogonW(
 LPCWSTR lpUsername,
 LPCWSTR lpDomain,
 LPCWSTR lpPassword,
 ...);
 
 но чтобы вызвать функцию, нужно знать имя, домен и пароль текущего пользователя. А вот как это узнать????
 |  
|  |  |  | А какая разница system там или user?  30.11.03 04:56 Автор: Killer{R} <Dmitry> Статус: Elderman
 |  
| Система тоже юзер. Делай интерактивный сервис и не мучайся. Вот я пишу прогу с окошками и прочим - работает сервисом и даже иконку в трее показывает по даблклику на которой она открывается. |  
|  |  |  | [Win32] Ответ никак :( Винда сама их не знает. Но...  30.11.03 03:56 Автор: Disappear Статус: Незарегистрированный пользователь
 |  
| Мне все-же удалось добиться интерактивности, для этого пришлось еще воспользоваться OpenWindowStation и OpenDesktop, но все же новый процесс запускается как SYSTEM и поэтому он не может взаимодействовать с клиенским реестром и прочее...
 Как же всетаки сделать так чтобы процесс запускался под текущим юзером.
 
 |  
|  |  |  |  | [Win32] Ответ никак :( Винда сама их не знает. Но...  30.11.03 05:03 Автор: Killer{R} <Dmitry> Статус: Elderman
 |  
| > но все же новый процесс запускается как SYSTEM и поэтому он > не может взаимодействовать с клиенским реестром и прочее...
 > Как же всетаки сделать так чтобы процесс запускался под
 > текущим юзером.
 Для этого надо получить token текущего юзера и создать процесс через CreateProcessAsUser. Я лично ничего более умного чем открытие процесса шелла и делания OpenProcessToken не придумал. Если ктото знает как получить token от имени текущего залогиненого юзера а не заюзать с уже запущенного процесса буду очень рад узнать Ж).
 |  
|  |  |  |  |  | [Win32] ?? CoImpersonateClient  30.11.03 15:51 Автор: Disappear Статус: Незарегистрированный пользователь
 |  
| На сколько я понял, чтобы "внедриться", а именно получить права текущего логона. Нужно вызвать CoImpersonateClient в моем COM сервере. И это вроде работает. Затем я запрашиваю токентекушегопроцесса, которые теперь имперсонирован (какое дебильное слово). OpenThreadToken(GetCurrentThread(), ...)
 Я получил, ура! Но в MSDN сказано что это имперсональный токен, а мне нужно получить из него primary токен чобы я мог вызывать CreateProcessAsUser.
 И получить я его должен с помощью функции DuplicateTokenEx.
 Я вызвал DuplicateTokenEx,
 DuplicateTokenEx(ImpToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &PrimToken)
 в ответ получил FALSE, ... вот до сих пор с этим и борюсь.
 
 Кто знает, как получить primary из impersonate токена???
 |  
|  |  |  |  |  |  | Ниженаписанный код запускает из сервиса процесс с правами...  01.12.03 23:35 Автор: Killer{R} <Dmitry> Статус: Elderman
 |  
| Ниженаписанный код запускает из сервиса процесс с правами запущенного шелла: HWND taskwnd=FindWindow("Progman","Program Manager");
 if(taskwnd)
 {
 DWORD pid=0;GetWindowThreadProcessId(taskwnd,&pid);
 HANDLE prc=OpenProcess(PROCESS_ALL_ACCESS,0,pid);
 if(prc)
 {
 HANDLE tk=0;
 if(OpenProcessToken(prc,TOKEN_ALL_ACCESS,&tk))
 {
 PROCESS_INFORMATION pi;STARTUPINFO si;
 memset(&si,0,sizeof(si));si.cb=sizeof(si);
 CreateProcessAsUser(tk,"C:\\program files\\far\\far.exe",0,0,0,0,CREATE_DEFAULT_ERROR_MODE,0,0,&si,&pi);
 CloseHandle(pi.hProcess);
 CloseHandle(pi.hThread);
 CloseHandle(tk);
 }
 CloseHandle(prc);
 }
 }else MessageBox(0,"No shell window found","Error",MB_ICONERROR);
 Недостаток понятен - нету стандартного шелла - ниче не запустится. Можно описать в доке к программе что это фича. Можно положить в автозапуск свою прогу которая создает окно вместо шелла Ж). Можео вообще положить в автозапуск процесс-хелпер и запускать проги через него каким нибудь макаром (например подавая команды через трубы, а то и простым PostMessage())
 |  
|  |  |  |  |  |  | [Win32] А зачем тебе это, собственно, надо?  01.12.03 04:24 Автор: Zef <Alloo Zef> Статус: Elderman
 |  
| Если тебе нужно сделать оболочку для сервиса, которая сохраняла бы настройки в пользовательском профиле - пропиши ее в автозапуск. И пусть она оттуда в свернутом виде стартует. |  
|  |  |  |  |  |  |  | [Win32] Это должен быть сервис, однозначно  01.12.03 17:59 Автор: Disappear Статус: Незарегистрированный пользователь
 |  
| Я не могу из-за такой фигни пускать весть сервис на процесс юзера. Да и авторан - уже не модно.
 |  
|  |  |  |  |  |  |  |  | [Win32] Почему "Весь"? Суп - отдельно, мухи - отдельно.  02.12.03 04:56 Автор: Zef <Alloo Zef> Статус: Elderman
 |  
| Сервис - консольное приложение - сервер, графическая оболочка под текущим юзером - клиент. И вообще, лучше, если сервис - sys-драйвер, а клиент к нему через DeviceIoControl обращается. |  
 
 
 |  |