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