![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Добрый день
![]() Никогда не писал службы... Помогайте... Задача проста, надо написать службу, установить ее, а служба должна следить, запущена ли моя програма. Если нет, то запустить, если да, то ничего не делать... ![]() Это сообщение отредактировал(а) ZBugz - 7.8.2014, 13:25 |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Ох, и нажили же вы проблем себе
![]() How to start GUI from service under Windows Vista/7 P.S. Ссылка любезно предоставлена kirillkr Это сообщение отредактировал(а) kami - 7.8.2014, 22:44 |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
первые вопросы на которые надо дать ответ, это: Под кем запущена программа? Где запущена программа? только после этого можно определиться с тем, Как? решить задачу -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
ZBugz |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
1. По текущем пользователем. Хотя, если есть варианты указать другого пользователя, я не против это тоже написать. 2. В той же папке где и сервис. Задача у меня простая... Я написал программу, она в автозапуске на сервере... Но иногда выключается питание и APC не хватает, после подачи питания, сервер загружается, но программа то не запускается, если не войти под юзером... А надо что бы запускалась. Вот и хочу написать сервис, который стартанет мою программу... Добавлено через 48 секунд
Спасибо, гляну. Я и сервис то сам еще не писал даже ![]() |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Тогда - это неправильная постановка задачи. Сервис не сможет стартануть программу от имени пользователя, если пользователь не залогинен. Значит - сперва надо залогинить юзера. А раз программа стоит в автозапуске - то больше ничего не надо делать, она сама запустится при логоне. Другой вопрос - а надо ли ее запускать от пользователя, не сможет ли она работать от имени системной учетки? |
|||
|
||||
Delvish |
|
|||
![]() oO ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 13.12.2006 Репутация: 1 Всего: 4 |
||||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
вообще-то нет. Сервис в любом случае работает из-под пользователя, и пошло это с момента их появления. В большинстве своем этот "изподпользователь" - LOCALSYSTEM. А начиная с Висты просто запретили интерактивность сервисов. Но даже интерактивному сервису совершенно необязателен был активный рабочий стол. В любом случае - чтобы запустить приложение в оконной станции, сессии и рабочем столе пользователя - надо, чтобы этот пользователь был залогиненю Это сообщение отредактировал(а) kami - 8.8.2014, 11:37 |
|||
|
||||
Delvish |
|
|||
![]() oO ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 13.12.2006 Репутация: 1 Всего: 4 |
Извиняюсь, спутал с приложениями, запускаемыми планировщиком с возможностью выбора варианта запуска "вне зависимости от регистрации пользователя". Кстати, не так давно я поднимал схожую тему и реализовал почти так, как это предлагается в статье, приведенной Вами в первом посте этой темы, только реализовал несколько проще:
|
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Delvish, увы, но этого кода мало, о чем явно говорится в ремарках MSDN, самое главное -
Отсюда - запускаемое приложение не получит нужные данные из реестра и доступ к сетевым ресурсам. Добавлено через 58 секунд Причем - совершенно не обязательно, что приложение само будет пытаться лезть в реестр, вполне возможно туда полезут используемые dll... |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
Текущий это какой? Тот кто владеет терминальной сессией? или RDP сессией? Речь не о местоположении файла, речь о пространстве имен. Под какой сессией, на каком рабочем столе? Вам наверно надо перенести функционал в сервис и всех то делов... Или просто из сервиса выполнить shellExec и пусть себе работает может, но смысла в этом особого нет. если только конкретный пользователь не обладает "ценными" правами (например это аккаунт на сервере баз данных MSSQL).
да ну что Вы говорите? а в nt4 они что ждали пока админ протрезвеет и залогинется? не запретили, а привели к "безопасному" виду. Показать окно на любом рабочем столе возможно, но окна создаваемые сервисом по умолчанию привязаны его рабочему столу. нет не надо. процесс от имени любого пользователя может работать в пределах любого пространства если это не запрещено политикой. изначально это не запрещено. в частности планировщик задач так и работает. ZBugz, в вашем случае лучший и простейший вариант создать задачу в планировщике, указать там нужного пользователя и все. Подходящий триггер "При запуске". Пока пользователь не залогинется программа будет висеть на десктопе default пользователя system, как только появится пользователь, программа перескочит на его рабочий стол. -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Окна от интерактивных сервисов в Висте показывались на отдельном рабочем столе, переключение на который происходит с использованием службы "Обнаружения интерактивных служб". В Win7 эта служба по умолчанию не в автозапуске. Сам сервис не может получить доступ к рабочему столу пользователя.
Пример/ссылку возможности этого можно? помнится, сие для меня была очень большая проблема (которую я не решил, а до сих пор хочется) - отобразить окно, созданное сервисом на десктопе пользователя, сессию которого можно получить через WTSGetActiveConsoleSessionID. Это сообщение отредактировал(а) kami - 8.8.2014, 16:27 |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
Да что вы говорите? и кто же ему помешает? Создавать окна с правами системы на рабочем столе терминального пользователя потенциально не безопасно, это да... так пусть разработчик думает... его предупредили... А вот то что окна сервиса автоматически не выкидывает на терминальный рабочий стол, это да... и это правильно. ну... в висте много странностей было... переходный период, у всех бывает... наверно обратная совместимость требовалась, потом как основные игроки перестроились службу отключили. у Rouse_ есть пример... там как раз сервис с окнами, не помню только насколько он соответствует этой теме... а в целом делается примерно так:
этот параметр и определяет на какой рабочий стол будет подцеплен поток. Создаем поток привязываем его к нужному столу Создаем окно в контексте потока. Оно отобразилось на нужном рабочем столе... Единственное рабочий тол типа "logon" не принимает потоки от кого попало... -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Вы утверждали, что сервис может отобразить окно на рабочем столе пользователя. StartupInfo относится к запуску отдельного процесса. Даже если не брать это в расчет, сей параметр всего лишь определяет, какой рабочий стол будет использован. При этом рабочий стол должен принадлежать WinSta, под которым запущен процесс. Для справки - у каждой Window Station свой набор столов, по умолчанию - default. Да, Window Station можно переключать, но увы - только в рамках своей сессии. Вы не в состоянии открыть десктоп пользователя. Итого - указание WinSta0\Default приведет к тому, что отдельный процесс будет использовать дефолтный десктоп, принадлежащий сессии родительского процесса, т.е. - сервису. А у сервисов - отдельный, не-интерактивный десктоп. Пример в студию. Что угодно - нарисовать линию, показать окно - любое действие из сервиса в Vista|Win7, воздействующее на рабочий стол пользователя. Выше я дал пруфлинки, почему считаю это невозможным. На всякий случай - подчеркну: непосредственно из сервиса, а не отдельного приложения, запущенного им. Это сообщение отредактировал(а) kami - 8.8.2014, 17:50 |
|||
|
||||
Delvish |
|
|||
![]() oO ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 13.12.2006 Репутация: 1 Всего: 4 |
На счет раздела HKCU я не проверял, но вот сеть работает исправно. Или под сетевыми ресурсами имеется ввиду доступ к шарам? В общем, как это описал выше drkot, в моем случае одна программа запускается от имени Системы, ждет входа пользователя, после чего приведенным выше кодом запускает основную программу, которая работает безо всяких проблем. Если же топикстартеру не нужно ждать логина пользователя, то планировщик, как я писал выше, позволяет запускать задачи вне зависимости от регистрации. Ему просто нужно определиться с самой задачей ![]() |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
Во первых Вы правы в своих суждениях. Но Вы движетесь по пути, который не предполагает решения. Конечно можно углубиться в права и привилегии и переключить окно с одной станции на другую, но это не тот путь... Никто не мешает создать процесс под в нужной станции/столе, и выполнить то что нужно, при этом задав процессу права пользователя ... в этом вопросе не могу с Вами согласится... я же говорю скачайте пример с сайта Rouse и не создавайте панику... Функциональный пример для этой задачи в три строчки не поместишь... пример от Rouse Тотя могли и сами скачать, чай не дети малые. а в чем разница? а... да... Вместо того чтобы пройти в дверь, мы по старинке пытаемся пробить стену головой... ну тут каждый выбирает по себе... извольте... -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |