доброе время суток.
Есть сервис приложение, работает под учеткой localSystem.
Есть приложение обычное, работает под текущим юзером. У этого приложения есть окно (HWND), принемающее внешние команды через SendMessage.
Необходимо из сервиса отправить сообщение выше описанному приложению.
читал мсдн, пробовал работать с windows станциями и менрять десктоп. Брал станцию Winsta0 и десктоп Default. В итоге, не получается пока.
При поиске окна FindWindow(или findWondowEx) не видет окно. Наверное невено установлен десктоп.
Ребята помоги в данной проблеме. Спасибо.
Здравствуйте, AndreyX, Вы писали:
AX>доброе время суток. AX>Есть сервис приложение, работает под учеткой localSystem. AX>Есть приложение обычное, работает под текущим юзером. У этого приложения есть окно (HWND), принемающее внешние команды через SendMessage. AX>Необходимо из сервиса отправить сообщение выше описанному приложению.
Здравствуйте, AndreyX, Вы писали:
AX>доброе время суток. AX>Есть сервис приложение, работает под учеткой localSystem. AX>Есть приложение обычное, работает под текущим юзером. У этого приложения есть окно (HWND), принемающее внешние команды через SendMessage. AX>Необходимо из сервиса отправить сообщение выше описанному приложению.
AX>читал мсдн, пробовал работать с windows станциями и менрять десктоп. Брал станцию Winsta0 и десктоп Default. В итоге, не получается пока. AX>При поиске окна FindWindow(или findWondowEx) не видет окно. Наверное невено установлен десктоп. AX>Ребята помоги в данной проблеме. Спасибо.
желательно все начиная с XP SP3, в данный момент пробую под 7-ку
Здравствуйте, AndreyX, Вы писали:
AX>>Есть сервис приложение, работает под учеткой localSystem. AX>>Есть приложение обычное, работает под текущим юзером. У этого приложения есть окно (HWND), принемающее внешние команды через SendMessage. AX>>Необходимо из сервиса отправить сообщение выше описанному приложению.
AX>желательно все начиная с XP SP3, в данный момент пробую под 7-ку
MS рекомендует запускать свой процесс в сессии пользователя для такого рода взаимодействия.
Т.е. можно запустить свой процесс из сервиса и через него отправлять оконные месаги и т.п.
Решение выглядит немного сложнова-то, зато будет работать и под XP и под 7кой без каких-либо изменений.
Процесс и сервис могут общаться по разному, я бы выбрал LRPC
Здравствуйте, AndreyX, Вы писали:
AX>доброе время суток. AX>Есть сервис приложение, работает под учеткой localSystem. AX>Есть приложение обычное, работает под текущим юзером. У этого приложения есть окно (HWND), принемающее внешние команды через SendMessage. AX>Необходимо из сервиса отправить сообщение выше описанному приложению.
Оконные сообщения — это не секьюрно.
Лучше использовать каналы (pipes) или другие средства межпроцессных коммуникаций.
AX>читал мсдн, пробовал работать с windows станциями и менрять десктоп. Брал станцию Winsta0 и десктоп Default. В итоге, не получается пока. AX>При поиске окна FindWindow(или findWondowEx) не видет окно. Наверное невено установлен десктоп. AX>Ребята помоги в данной проблеме. Спасибо.
На Vista и выше службы работают в отдельной сессии, изолированной от пользовательских сессий.
Поэтому просто менять оконную станцию и рабочий стол потока мало, нужно еще чтобы оба процесса, —
служба и приложение, — выполнялись в одной и той же сессии. Это можно сделать (закрыв глаза на
некоторые аспекты безопасности), но если я начну описывать как, Вы очень быстро поймете, что
гораздо проще и надежнее будет отказаться от оконных сообщений и использовать таки каналы.
Дело в том, что одновременно может быть залагинено больше одного пользователя (это тип обязательное требование).
А вообще, если настроить сервис под определенного пользователя, а в системе будет одновременно залагинено например 3 юзера, то не будет же создано три экземпляра сервиса ?
зотелось бы узнать можно ли вобще так сделать как я спрашивал ранее. Пока не хочется прибегать к други методам IPC.
А, насколько я знаю LRPC рабоатет на windows окнах, получается в данном слу. тож не прокатит.
Здравствуйте, AndreyX, Вы писали:
AX>Ага. получается такое возможно только на NT, где сессия сервиса совпадает с пользователькой (0-нулевая) и то частный случай ?
Возможно все
Грубо говоря — да. Но на NT 5.x (Win2K, WinXP, Srv2003) нулевая сессия совпадает только с сессией
первого залогиненного пользователя. Частный случай, не больше.
Чтобы послать сообщение в чужую сессию, нужно будет сначала создать процесс в этой сессии, а уже
из него выполнить SendMessage. Так будет работать. Только, опять же, зачем это все, если есть каналы,
события, мэилслоты и т.п. ?
Здравствуйте, angry.andrew, Вы писали:
O>>Лучше использовать каналы (pipes) или другие средства межпроцессных коммуникаций. AA>ИМХО, для этих целей удобнее всего RPC.
RPC — это довольно расплывчатое понятие.
Что конкретно Вы имеете в виду ?
AX>Дело в том, что одновременно может быть залагинено больше одного пользователя (это тип обязательное требование).
AX>А вообще, если настроить сервис под определенного пользователя, а в системе будет одновременно залагинено например 3 юзера, то не будет же создано три экземпляра сервиса ?
Сервисы стоят отдельно от юзерских сессий
AX>зотелось бы узнать можно ли вобще так сделать как я спрашивал ранее. Пока не хочется прибегать к други методам IPC.
По ХР можно вроде, под 7кой уже точно нет — политика партии изменилась.
AX>А, насколько я знаю LRPC рабоатет на windows окнах, получается в данном слу. тож не прокатит.
Впервые слышу про "LRPC рабоатет на windows окнах" — линк в студию. Вообще функционал RPC стартует в ОС, когда никаких окон еще в помине нет — это один из базовых способов общения служб в винде, то что он не рекламируется как очередная прорывная технология... ну так ему лет-то уж сколько..
Как только Вы начинаете обдумывать протокол доступа к серверу, конкурирующий доступ, как хранить контекст сессии, парсинг команд и т.п. — имейте ввиду, что все это уже есть в RPC.
Весомый аргумент против виндового RPC — общение между машинами с юниксом и виндой (как пример)
O>>>Лучше использовать каналы (pipes) или другие средства межпроцессных коммуникаций. AA>>ИМХО, для этих целей удобнее всего RPC.
O>RPC — это довольно расплывчатое понятие. O>Что конкретно Вы имеете в виду ?
O>RPC — это довольно расплывчатое понятие. O>Что конкретно Вы имеете в виду ?
Стандартный виндовый.
Использовал его как раз для подобной задачи (общение сервиса с пользовательскими процессами в разных сессиях). По-моему, идеальный вариант.
O>То есть, MIDL, proxy-stub, маршаллинг и т.п. ?
Да.
O>Где об этом можно подробнее почитать ? O>Не то, чтобы я сильно профан, но по этой части я кроме COM нигде глубоко не копал...
Единый хороший источник информации посоветовать сложно, я сам что-то гуглил, что-то в МСДН читал, разбирал примеры в Platform SDK. Есть еще старая но достаточно толковая книга Microsoft RPC Programming Guide (John Shirley, Ward Rosenberry).
RPC зачастую удобнее COM, если нужно просто вызвать процедуру из другого процесса, т.к. не нужно писать всякую COM-овскую шелуху вроде реализации IUnknown (или использовать всякие ATL), регистрировать классы, следить за тем, что в каких апартаментах создается и используется, и т.д. и т.п.