Всем привет!
Моему сервису необходимо отобразить диалоговое окно, причём он должен это уметь до входа пользователя в систему. Если я ставлю Interactive = true, то окно отображается только после входа в систему. Вот Windows может этот как-то делать. Например, при конфликте IP-адресов выдаётся сообщение об этом ДО входа в сеанс пользователя. Как мне выдавать такие сообщения???
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
06-02-2008 09:58
1. Определить какой пользователь залогинен.
...Я копаю в нужном направлении?
Не вполне. Возможно, что стоит терминальный сервер вовсе без клавы и телевизора. На нём может зайти несколько юзеров. Каждый может наплодить несколько сессий.
Не забивайте себе голову! Делайте как Микрософт! Сервис - отдельно, а управление им - отдельно.
Можно для каждого пользователя установить процесс-демон, например который отображает иконку в системном трее, а взаимодействовать с сервисом он будет посредством MailSlots, Pipe, сокетов или еще чего нибудь можно придумать. Этот то процесс и будет выдавать сообщения.
Все-таки надо, наверное, сказать почему отдельное приложение будет лучше. Ваш способ не сработает в системе с включенным Fast User Switching. Там юзеры работают в отдельных сессиях, а между сессиями не работающему процессу не перепрыгнуть, можно только новый процесс в этой сессии запустить.
Да. Только проще и надежней было бы просто запустить в сеансе пользователя отдельное приложение, которое свяжется с сервисом и передаст ему команды пользователя. А флаг SERVICE_INTERACTIVE_PROCESS убрать и вообще забыть о его существовании.
Я пишу сервис-монитор защиты сети от специфических угроз в моей локальной сети. Насчёт необходимости интерактивности в отсутствие залогиненного пользователя я подумаю - может быть стоит производить некие действия по-умолчанию без вмешательства пользователя.
Однако не ясным остались пара моментов. На Viste при включенном флаге SERVICE_INTERACTIVE_PROCESS при поытке вывести сервисом на экран диалоговое окно система переключаетя в другой, как я понял, desktop и выводит его там. Чтобы этого не происходило, насколько я понял мне нужно делать так:
1. Определить какой пользователь залогинен.
2. Получить его текущий десктоп.
3. Установить вывод окон сервиса на десктоп пользователя
4. Вывести диалоговое окно
5. Вернуть назад десктоп сервиса.
Я бы еще спросил: а зачем Ваша программа спроэктирована таким образом, что ей нужно исправить ситуацию до входа в систему? Вы взаимодействуете с другими сервисами системы? Если нет - попробуйте все же переделать программу таким образом, чтобы она не мучала зря пользователей.
Если Вы про WindowsStations/Desktops, то могу только посоветовать MSDN.
А вообще, насколько правильно выводить окно (не MessageBox) до входа в систему? Ведь пользователя может и не быть за компьютером.
Сообщения или сложные диалоговые окна?
Если просто сообщение, то см. флаг MB_SERVICE_NOTIFICATION для MessageBox.
Если что-то более сложное - придется разбираться с оконными станциями (WindowStations) и рабочими столами (Desktops).
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.