Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Handle из сервиса


Автор: Magik 3.8.2008, 16:11
Порылся где можно, но так и не нашёл ответа:-
В службе это не катит – 
var
h: hwnd;
begin
h:= FindWindow('Progman', 'Program Manager');
  if  h<>0 then
       MessageBox(0, 'ПРОТОКОЛ!', 'ServiceName', MB_SERVICE_NOTIFICATION or MB_ICONWARNING or MB_OK);
End; 
Очевидно хендл не определяется. Хотя при запуске как ехе-приложение – всё работает. С MessageBox – проблем нет – проверено. 
Может есть варианты?

Автор: Virtuals 3.8.2008, 16:52
Magik, 
батенька курите мсде, 

ну а если лень то поиск по
EnumDesktops
OpenDesktop
SwitchDesktop

короче вам треба понимание о: множественности рабочих столов, 
намек...
стол где ctrl+alt+del = winlogon
где юзер живет = default
а где сервис smile  smile  smile  smile = станция произвольная!!! smile 
так что далее курим
SetProcessWindowStation

удачи

Автор: Magik 3.8.2008, 18:49
Благодарю за ответ и намёк! К сожалению я давно бросил курить! Придётся жевать!
Может ещё у кого-нибудь  есть пожелания?

Автор: Virtuals 3.8.2008, 19:18
Magik, 
без шуток, все что перечислил достаточно для понимания вашей проблемы!
прикол в том что в виндах есть множество рабочих столов, живущих на множестве оконных станций
так вот FindWindow работает в пределах: WindowStation/Desktop
а сервис запускается с произвольным WindowStation! (попробуйте выставить у сервиса: взаимодействие с рабочим столом, но это очень неправильно) smile 

ЗЫ попробуйте поиск по моим постам, просто в последнее время очень активно ковырял данный вопрос, и удивило как мало это обсуждается smile 

Автор: CodeMonkey 3.8.2008, 21:45
Попробуйте также почитать http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1348.
То, что вы сейчас пытаетесь сделать - это одна из наихудших вещей, которые вы только можете сделать. Я настоятельно не рекомендую реаизовывать такую логику. Служба не должна взаимодействовать с пользователем. Напишите это крупными буквами на своём мониторе smile
Если вы расскажете немного больше про свою задачу, возможно, вам подскажут правильный путь её реализации.

Автор: Magik 4.8.2008, 07:33
 to Virtuals:
Понял! Всё ОК!

А если немного конкретнее, то на одном сервере необходимо ограничить время работы пользователя. Далее сервер переводится в режим смены пользователя с новым паролем по условию того, что серевер не находится в режиме смены пользователя. Этим условием я считал наличие рабочего стола. Может есть и другие способЫ, но я подумал, что нет ничего проще определить хендл этого окна.  Тем более, что в  MessageBox() через его Handle я спокойно нажимаю на нужную кнопку по таймеру.  
Буду рад, если предложите иной способ.  Одно необходимое условие, этот код надо запускать до входа пользователя (это нужно для другой задачи).  
   

Автор: CodeMonkey 4.8.2008, 08:33
Цитата(Magik @  4.8.2008,  07:33 Найти цитируемый пост)
А если немного конкретнее, то на одном сервере необходимо ограничить время работы пользователя.

Посмотрите:
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=60639
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=63639
http://www.rsdn.ru/Forum/message/3001453.flat.aspx

Я бы сделал как приложение, запускаемое планировщиком с системной учёткой при логине пользователя. Как вариант - можно поместить в автозагрузку.

Хотя службой в принципе тоже можно. Но это имеет смысл, только если у вас будет много пользователей работать одновременно. В этом случае служба должна ловить SERVICE_CONTROL_SESSIONCHANGE: http://msdn.microsoft.com/en-us/library/ms683241(VS.85).aspx

Ещё можно вот это почитать: http://download.microsoft.com/download/3/b/a/3ba6d659-6e39-4cd7-b3a2-9c96482f5353/Winlogon%20Notification%20Packages%20Removed%20Impact%20on%20Windows%20Vista%20Planning%20and%20Deployment.doc

Автор: Magik 4.8.2008, 13:48
В принципе проблема ясна.  Пока решил вообще в сервисе не использовать оконные сообщения.  А планировщик, - не хотел бы использовать. Слишком много ушлых ребят развелось с шаловливыми ручонками.

Virtuals & CodeMonkey - C Наилучшими пожеланиями!

Автор: CodeMonkey 4.8.2008, 14:05
Цитата(Magik @  4.8.2008,  13:48 Найти цитируемый пост)
А планировщик, - не хотел бы использовать. Слишком много ушлых ребят развелось с шаловливыми ручонками.

Тогда не ясно, что им мешает выключить вашу службу. 

Автор: Magik 4.8.2008, 16:52
Ну так, уровень юзера конечно играет роль. Если службу  грамотно спрятать, то найти её, - нужно ещё и голову поломать. С другой стороны это я вам сказал о наличии её, и роли (правда не до конца).  А юзер просто будет поставлен перед фактом смены пользователя без каких либо причин.
Кстати, ну и партизаны же вы все! Все проблемы с окнами решаются установкой "галки" в свойстве сервиса "взаимодействие с рабочим столом" .! Ведь знали? - А?

Автор: CodeMonkey 4.8.2008, 16:58
Для некоторых вопросов правильный ответ: "если вы знаете ответ - держите его при себе".

Автор: Virtuals 4.8.2008, 17:06
CodeMonkey,  smile думаю права в системе...

Автор: CodeMonkey 4.8.2008, 18:26
Цитата(Virtuals @  4.8.2008,  17:06 Найти цитируемый пост)
CodeMonkey,   думаю права в системе...

Если бы это было так, то тогда нет никаких проблем сделать так, что они не смогут завершить любое другое приложение (не сервис), запущенное из-под админской/системной учётки? Устанавливаются нужные права и приложение, скажем, помещённое в автозапуск, нельзя ни удалить оттуда, ни завершить, если оно начало выполняться. А автор вопроса, напротив, говорит, что так сделать нельзя, т.к. пользователи работают под неограниченными учётками. Откуда следует, что нет препятствий для остановки службы простыми пользователями.

Автор: Virtuals 4.8.2008, 19:23
если есть права локального админа, то аксиома (тоесть не требует доказательств), ничего не поможет вопрос только времени и скорости усвоения информации пользователем smile , все зашиты безтолку.

Автор: CodeMonkey 5.8.2008, 02:40
Цитата(Virtuals @  4.8.2008,  19:23 Найти цитируемый пост)
если есть права локального админа, то аксиома (тоесть не требует доказательств), ничего не поможет вопрос только времени и скорости усвоения информации пользователем  , все зашиты безтолку.

Именно про это я и говорю.

Автор: Virtuals 5.8.2008, 05:37
Magik, 
Цитата

Кстати, ну и партизаны же вы все! Все проблемы с окнами решаются установкой "галки" в свойстве сервиса "взаимодействие с рабочим столом" .! Ведь знали? - А?


читаем через строчку?

Цитата

так вот FindWindow работает в пределах: WindowStation/Desktop
а сервис запускается с произвольным WindowStation! (попробуйте выставить у сервиса: взаимодействие с рабочим столом, но это очень неправильно)  


или вы хотели сразу ответ: типа поставь галку...

ЗЫ если ваш сервис будет иметь окна на рабочем столе пользователя - то даже с правами гостя!!! его можно угробить
так что
Цитата

сервис запускается с произвольным WindowStation!

это не просто так!, это безопасность сервиса.

Автор: Magik 5.8.2008, 08:18
Цитата(Virtuals @  5.8.2008,  05:37 Найти цитируемый пост)
читаем через строчку?


На самом деле было!
..------------------
Потом, у меня два пользователя, с правами администратора, один из которых администратор . Так что права раздовать как то не к чему.
..----------------------------
Цитата(Virtuals @  5.8.2008,  05:37 Найти цитируемый пост)
ЗЫ если ваш сервис будет иметь окна на рабочем столе пользователя - то даже с правами гостя!!! его можно угробить

Сам сервис то без формы, а окно  (MessageBox), появляется на 20 секунд. Потом убивается. Проблема было определить Handle рабочего стола.
..--------------------
 Кстати по поводу окон в сервисах. На этом же сервере крутятся 6 служебных сервисов. Один из которых - транслятор 101 протокола в канал связи (....ага, тот самый!).  Написан он известным производителем в этой области. Так вот он имеет оконный интерфейс, который можно вызвать из трея. В этом окне можно посмотреть параметры протокола , трассировку(online) , записывать логи в файл и т.д.
 Так что , CodeMonkey в этом отношении немного не прав (по моему мнению).
2 Virtuals :
Приведите пример, что в Виндовсе отвечает критериям безопасности? Или о какой безопасности идёт речь?

Автор: CodeMonkey 5.8.2008, 09:47
Цитата(Magik @  5.8.2008,  08:18 Найти цитируемый пост)
 Так что , CodeMonkey в этом отношении немного не прав (по моему мнению).

Да мне-то. Если хотите, можете и дальше завинчивать шурупы ногтем, но я советовал и буду советовать отвёртку. smile

Автор: Virtuals 5.8.2008, 13:55
Magik, 
внимательно посмотрите на список процессов, и 99% заметите что ваш "транслятор 101 протокола" имеет два процесса один от пользователя другой от систем (сервис)
это совсем другое чем сервис в рабочем столе пользователя!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)