Сервис - консольное приложение - сервер, графическая оболочка под текущим юзером - клиент. И вообще, лучше, если сервис - sys-драйвер, а клиент к нему через DeviceIoControl обращается.
У меня есть программка, которая запущена и работает как системный сервис WindowsNT
Как известно системные сервисы не имеют интерактивности, то есть очереди сообщений и окон.
Дело такое: мне нужно запустить чужую программу из моего сервиса,
для этого я использую
программа запускается, но она запускается тоже как системный процесс :( и поэтому глупо сидит в памяти и взаимодействавать с ней невозможно. Тоесть, не создается никаких окон, программа себя никак не проявляет.
Как запустить программу независимо от моего системного сервиса???
[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 от имени текущего залогиненого юзера а не заюзать с уже запущенного процесса буду очень рад узнать Ж).
На сколько я понял, чтобы "внедриться", а именно получить права текущего логона. Нужно вызвать 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 Статус: Незарегистрированный пользователь
Сервис - консольное приложение - сервер, графическая оболочка под текущим юзером - клиент. И вообще, лучше, если сервис - sys-драйвер, а клиент к нему через DeviceIoControl обращается.