Вопрос по сервису. Может быть кто сталкивался?
От: AlexanderGDI Россия  
Дата: 16.08.06 12:07
Оценка:
Типовой сервис стартует вместе с ОС (например WinXP) от имени системы. Сразу после старта сервис пускает ряд процессов, среди них часть интерактивных.
Процессы пускаются от имени другого пользователя с известными реквизитами (права что то типа PowerUser).
Делается это приблизительно так как описано в примере от MSDN "Starting an Interactive Client Process".

Вот фрагмент кода Delphi5 (исключая проверки результатов функций и освобождение ресурсов)


    // получаем маркер пользователя

    LogonUser(UserName, nil, UserPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ClientToken);

    // подключаемся к WinSta0 и Desktop Default
    
    hwinstaSave:=GetProcessWindowStation;
                  _WINSTA:=OpenWindowStation('WinSta0', FALSE, READ_CONTROL or WRITE_DAC);
                 SetProcessWindowStation(_WINSTA);
    _desk:=OpenDesktop('Default', 0, FALSE, READ_CONTROL or WRITE_DAC or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS); 

    // далее все как в примере: получаем SID регистрации пользователя и модифицируем ACL рабочей станции и стола соответственно

        GetLogonSid(ClientToken, pSid);
        AddAceToWindowStation(_WINSTA, pSid);
        AddAceToDesktop(_desk, pSid);

    // заимствуем права и создаем процесс

        ImpersonateLoggedOnUser(ClientToken);

                  with supInfo do begin
                    cb:=sizeof(supInfo);
                    lpDesktop:=PChar('WinSta0\Default');
                    dwFlags:=STARTF_USEPOSITION or STARTF_USESIZE or STARTF_USECOUNTCHARS or STARTF_USEFILLATTRIBUTE or STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
          wShowWindow:=SW_NORMAL;
                  end;

        CreateProcessAsUser(ClientToken, nil, CmdLine[Index], nil, nil, false, CREATE_DEFAULT_ERROR_MODE, nil, LastDir, supInfo, ProcInfo);
    RevertToSelf;

    SetProcessWindowStation(hwinstaSave);


Вроде как все весело отрабатывает.

После входа в систему на рабочем столе вижу окна запущеных приложений, правда окна имеют немного не тот цвет, но отрисовано вроде правильно.
При попытке вызвать Help из этих приложений получаю пустые рамки окон с графическими багами.
Если успеть залогиниться до того как сервис стартует процессы то все окна открытые из этих процессов отображаются правильно.

Что я делаю не так?
Re: Вопрос по сервису. Может быть кто сталкивался?
От: Danchik Украина  
Дата: 16.08.06 14:14
Оценка:
Здравствуйте, AlexanderGDI, Вы писали:

[Skip]

AGD>Что я делаю не так?


Межет, неплохо было бы вызвать LoadUserProfile
Re: Вопрос по сервису. Может быть кто сталкивался?
От: Leonid Troyanovsky  
Дата: 16.08.06 16:19
Оценка: 1 (1)
Здравствуйте, AlexanderGDI, Вы писали:

AGD>Процессы пускаются от имени другого пользователя с известными реквизитами (права что то типа PowerUser).

..
AGD>Что я делаю не так?

Вот расскажи нам, плиз, зачем нужно это малоаппетитное варево, когда
искомое (на-ура, IMHO) достигается обычным автостартом или, даже,
возможно, логон-скриптом?
--
С уважением, LVT
Re[2]: Вопрос по сервису. Может быть кто сталкивался?
От: AlexanderGDI Россия  
Дата: 17.08.06 08:02
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Вот расскажи нам, плиз, зачем нужно это малоаппетитное варево, когда

LT>искомое (на-ура, IMHO) достигается обычным автостартом или, даже,
LT>возможно, логон-скриптом?

Служба следит за работоспособностью доверенных процессов, в случае утери работоспособности перезапускает их. Так же в зависимости от ситуации модифицирует список контроля. Сами процессы успешно функционируют и без участия пользователя, но некоторые исторически были разработаны с наличием пользовательского интерфейса для изменения конфигурационных настроек, имеют Help и т.д. Я прекрасно понимаю, что интерфейс интерфейсом а логика логикой — должны быть разнесены. Яркий пример — любой антивирусник ядро(в виде сервиса) функционирует всегда, для настроек программа непосредственно по надобности пользователя. Процессы(программы) которые я контролирую уже давно написаны и изменить их не имею возможности.
Re[2]: Вопрос по сервису. Может быть кто сталкивался?
От: Аноним  
Дата: 18.08.06 04:51
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Межет, неплохо было бы вызвать LoadUserProfile


Поясните, что вы имели в виду и как это мне поможет?

Вставил вызов LoadUserProfile сразу после LogonUser. Все отлично отработало, получил Handle (так понял связанный с пользовательским реестром). Ну и что дальше? Ситуация не изменилась. При попытке вызвать из процесса Help окно помощи какое то полупрозрачное и нормально не отрисовывается.

Я вот думаю может при добавлении ACE в ACL рабочего стола или станции забыл поместить в тело ACE какие нибудь нужные флаги, поэтому дочерние от запущеных процессов пытаются чтото наследовать, а не получается. Вобщем беда.
Re: Вопрос по сервису. Может быть кто сталкивался?
От: Аноним  
Дата: 19.08.06 12:09
Оценка:
Здравствуйте, AlexanderGDI,


AGD>Что я делаю не так?


Нвсколько я понимаю, ваш сервис запускается раньше нежели окончательно "сформируе" рабочий стол пользователя. От того такие и "глюки" с окнами.
Хм.. советую поставить в автозагрузку вашь сервис, ежели он создает процессы с окошками. Тобишь типа чегонить консольноо "net start [имя службы]", либо же разрулить — котлеты отдельно, а мухи отдельно
Re: Вопрос по сервису. Может быть кто сталкивался?
От: FirstStep Россия  
Дата: 20.08.06 05:02
Оценка:
Здравствуйте, AlexanderGDI, Вы писали:

AGD>Типовой сервис стартует вместе с ОС (например WinXP) от имени системы. Сразу после старта сервис пускает ряд процессов, среди них часть интерактивных.

AGD>Процессы пускаются от имени другого пользователя с известными реквизитами (права что то типа PowerUser).

Если стоит задача запускать процессы от имени другого пользователя то должна помочь утилита
ExecAs

В итоге пользователю не надо знать администраторский пароль а программы требующие привилегий нормально запускаются через ярлыки создаваемые этой программой. Если ярлыки закинуть в автозапуск то запуск будет автоматическим. Меня спасло от необходимости писать свой сервис/программу для запуска программ из под другой учётки без запроса пароля.
Re[2]: Вопрос по сервису. Может быть кто сталкивался?
От: Аноним  
Дата: 21.08.06 05:44
Оценка:
Здравствуйте, FirstStep, Вы писали:

FS>Если стоит задача запускать процессы от имени другого пользователя то должна помочь утилита

FS>ExecAs

FS>В итоге пользователю не надо знать администраторский пароль а программы требующие привилегий нормально запускаются через ярлыки создаваемые этой программой. Если ярлыки закинуть в автозапуск то запуск будет автоматическим. Меня спасло от необходимости писать свой сервис/программу для запуска программ из под другой учётки без запроса пароля.


хм..Ну если Вы ещеи заметили, служба человеку нужна не только для запуска процессов(программ). Ему она нужна для управления и контроля их выполнения. Нато он у него и сервис.Поэтому пихать ярлыки в автозапуск — не вариант. Советую всетаки помещать в автозапуск старт самого сервиса (через командную строку ..то есть "net start"), а не пихать туда ярлыки
Re[3]: Вопрос по сервису. Может быть кто сталкивался?
От: AlexanderGDI Россия  
Дата: 21.08.06 11:24
Оценка:
Здравствуйте, Аноним, FirstStep и ...

Прочитал ваши советы и не совсем понял или меня не поняли

Сервис стартует автоматически (то есть сразу как на то SCaM распорядится). Никаких регистраций пользователей он не ждет и процессы он стартует незамедлительно (процессы должны работать сразу и постоянно). Процессы сервис запускает от имени конкретного пользователя (логин и пароль известен) так как запускать от System это уж слишком. Запускаются они на WinSta0\Default и т.д. (см. начало темы).
Вся система пашет сколько угодно, через некоторое время к компу подходит юзер и локально входит в систему. На рабочем столе он видит окна процессов, но Help из них он вызвать не может, так как он нормально не отрисовывается и т.д. что и писал ранее. Проблема в том, что я не могу понять почему так происходит? Хотя чувствую что решение где то рядом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.