| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 а где сервис так что далее курим SetProcessWindowStation удачи |
| Автор: Magik 3.8.2008, 18:49 |
| Благодарю за ответ и намёк! К сожалению я давно бросил курить! Придётся жевать! Может ещё у кого-нибудь есть пожелания? |
| Автор: Virtuals 3.8.2008, 19:18 |
| Magik, без шуток, все что перечислил достаточно для понимания вашей проблемы! прикол в том что в виндах есть множество рабочих столов, живущих на множестве оконных станций так вот FindWindow работает в пределах: WindowStation/Desktop а сервис запускается с произвольным WindowStation! (попробуйте выставить у сервиса: взаимодействие с рабочим столом, но это очень неправильно) ЗЫ попробуйте поиск по моим постам, просто в последнее время очень активно ковырял данный вопрос, и удивило как мало это обсуждается |
| Автор: CodeMonkey 3.8.2008, 21:45 |
| Попробуйте также почитать http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1348. То, что вы сейчас пытаетесь сделать - это одна из наихудших вещей, которые вы только можете сделать. Я настоятельно не рекомендую реаизовывать такую логику. Служба не должна взаимодействовать с пользователем. Напишите это крупными буквами на своём мониторе Если вы расскажете немного больше про свою задачу, возможно, вам подскажут правильный путь её реализации. |
| Автор: Magik 4.8.2008, 07:33 |
| to Virtuals: Понял! Всё ОК! А если немного конкретнее, то на одном сервере необходимо ограничить время работы пользователя. Далее сервер переводится в режим смены пользователя с новым паролем по условию того, что серевер не находится в режиме смены пользователя. Этим условием я считал наличие рабочего стола. Может есть и другие способЫ, но я подумал, что нет ничего проще определить хендл этого окна. Тем более, что в MessageBox() через его Handle я спокойно нажимаю на нужную кнопку по таймеру. Буду рад, если предложите иной способ. Одно необходимое условие, этот код надо запускать до входа пользователя (это нужно для другой задачи). |
| Автор: Magik 4.8.2008, 13:48 |
| В принципе проблема ясна. Пока решил вообще в сервисе не использовать оконные сообщения. А планировщик, - не хотел бы использовать. Слишком много ушлых ребят развелось с шаловливыми ручонками. Virtuals & CodeMonkey - C Наилучшими пожеланиями! |
| Автор: CodeMonkey 4.8.2008, 14:05 | ||
Тогда не ясно, что им мешает выключить вашу службу. |
| Автор: Magik 4.8.2008, 16:52 |
| Ну так, уровень юзера конечно играет роль. Если службу грамотно спрятать, то найти её, - нужно ещё и голову поломать. С другой стороны это я вам сказал о наличии её, и роли (правда не до конца). А юзер просто будет поставлен перед фактом смены пользователя без каких либо причин. Кстати, ну и партизаны же вы все! Все проблемы с окнами решаются установкой "галки" в свойстве сервиса "взаимодействие с рабочим столом" .! Ведь знали? - А? |
| Автор: CodeMonkey 4.8.2008, 16:58 |
| Для некоторых вопросов правильный ответ: "если вы знаете ответ - держите его при себе". |
| Автор: Virtuals 4.8.2008, 17:06 |
| CodeMonkey, |
| Автор: CodeMonkey 4.8.2008, 18:26 |
Если бы это было так, то тогда нет никаких проблем сделать так, что они не смогут завершить любое другое приложение (не сервис), запущенное из-под админской/системной учётки? Устанавливаются нужные права и приложение, скажем, помещённое в автозапуск, нельзя ни удалить оттуда, ни завершить, если оно начало выполняться. А автор вопроса, напротив, говорит, что так сделать нельзя, т.к. пользователи работают под неограниченными учётками. Откуда следует, что нет препятствий для остановки службы простыми пользователями. |
| Автор: Virtuals 4.8.2008, 19:23 |
| если есть права локального админа, то аксиома (тоесть не требует доказательств), ничего не поможет вопрос только времени и скорости усвоения информации пользователем |
| Автор: CodeMonkey 5.8.2008, 02:40 | ||
Именно про это я и говорю. |
| Автор: Virtuals 5.8.2008, 05:37 | ||||||
Magik,
читаем через строчку?
или вы хотели сразу ответ: типа поставь галку... ЗЫ если ваш сервис будет иметь окна на рабочем столе пользователя - то даже с правами гостя!!! его можно угробить так что
это не просто так!, это безопасность сервиса. |
| Автор: Magik 5.8.2008, 08:18 | ||
На самом деле было! ..------------------ Потом, у меня два пользователя, с правами администратора, один из которых администратор . Так что права раздовать как то не к чему. ..----------------------------
Сам сервис то без формы, а окно (MessageBox), появляется на 20 секунд. Потом убивается. Проблема было определить Handle рабочего стола. ..-------------------- Кстати по поводу окон в сервисах. На этом же сервере крутятся 6 служебных сервисов. Один из которых - транслятор 101 протокола в канал связи (....ага, тот самый!). Написан он известным производителем в этой области. Так вот он имеет оконный интерфейс, который можно вызвать из трея. В этом окне можно посмотреть параметры протокола , трассировку(online) , записывать логи в файл и т.д. Так что , CodeMonkey в этом отношении немного не прав (по моему мнению). 2 Virtuals : Приведите пример, что в Виндовсе отвечает критериям безопасности? Или о какой безопасности идёт речь? |
| Автор: CodeMonkey 5.8.2008, 09:47 | ||
Да мне-то. Если хотите, можете и дальше завинчивать шурупы ногтем, но я советовал и буду советовать отвёртку. |
| Автор: Virtuals 5.8.2008, 13:55 |
| Magik, внимательно посмотрите на список процессов, и 99% заметите что ваш "транслятор 101 протокола" имеет два процесса один от пользователя другой от систем (сервис) это совсем другое чем сервис в рабочем столе пользователя! |