Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
  |   |   |   |   |   | 
[Win32] А зачем тебе это, собственно, надо?  01.12.03 04:24  Число просмотров: 1471
 Автор: Zef <Alloo Zef> Статус: Elderman
 | 
 
| 
Если тебе нужно сделать оболочку для сервиса, которая сохраняла бы настройки в пользовательском профиле - пропиши ее в автозапуск. И пусть она оттуда в свернутом виде стартует.
 | 
 
| 
<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 обращается.
 | 
 
 
  
 
 | 
 |