информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медСтрашный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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 обращается.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach