Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Служба и запуск программы, Служба и запуск программы 
:(
    Опции темы
ZBugz
  Дата 7.8.2014, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Добрый день smile 
Никогда не писал службы...
Помогайте...
Задача проста, надо написать службу, установить ее, а служба должна следить, запущена ли моя програма. Если нет, то запустить, если да, то ничего не делать...  smile  

Это сообщение отредактировал(а) ZBugz - 7.8.2014, 13:25
PM MAIL   Вверх
kami
Дата 7.8.2014, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Ох, и нажили же вы проблем себе smile Это совсем не простая задача...
How to start GUI from service under Windows Vista/7
P.S. Ссылка любезно предоставлена kirillkr

Это сообщение отредактировал(а) kami - 7.8.2014, 22:44
PM MAIL WWW   Вверх
drkot
Дата 8.8.2014, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(ZBugz @  7.8.2014,  14:25 Найти цитируемый пост)
запущена ли моя програма

первые вопросы на которые надо дать ответ, это:
Под кем запущена программа?
Где запущена программа?

только после этого можно определиться с тем, Как? решить задачу


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
ZBugz
Дата 8.8.2014, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(drkot @ 8.8.2014,  01:42)
Цитата(ZBugz @  7.8.2014,  14:25 Найти цитируемый пост)
запущена ли моя програма

первые вопросы на которые надо дать ответ, это:
Под кем запущена программа?
Где запущена программа?

только после этого можно определиться с тем, Как? решить задачу

1. По текущем пользователем. Хотя, если есть варианты указать другого пользователя, я не против это тоже написать.
2. В той же папке где и сервис.

Задача у меня простая... Я написал программу, она в автозапуске на сервере... Но иногда выключается питание и APC не хватает, после подачи питания, сервер загружается, но программа то не запускается, если не войти под юзером... А надо что бы запускалась. Вот и хочу написать сервис, который стартанет мою программу...

Добавлено через 48 секунд
Цитата(kami @ 7.8.2014,  22:41)
Ох, и нажили же вы проблем себе smile Это совсем не простая задача...
How to start GUI from service under Windows Vista/7
P.S. Ссылка любезно предоставлена kirillkr

Спасибо, гляну. Я и сервис то сам еще не писал даже  smile 
PM MAIL   Вверх
kami
Дата 8.8.2014, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(ZBugz @  8.8.2014,  06:19 Найти цитируемый пост)
сервер загружается, но программа то не запускается, если не войти под юзером... А надо что бы запускалась. Вот и хочу написать сервис, который стартанет мою программу...

Тогда - это неправильная постановка задачи.
Сервис не сможет стартануть программу от имени пользователя, если пользователь не залогинен.
Значит - сперва надо залогинить юзера.
А раз программа стоит в автозапуске - то больше ничего не надо делать, она сама запустится при логоне.

Другой вопрос - а надо ли ее запускать от пользователя, не сможет ли она работать от имени системной учетки?

PM MAIL WWW   Вверх
Delvish
Дата 8.8.2014, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Цитата(kami @  8.8.2014,  09:13 Найти цитируемый пост)
сперва надо залогинить юзера

начиная с Vista сервисы умеют запускаться вне зависимости от регистрации пользователя. так что вполне себе решение проблемы с автозапуском
PM MAIL   Вверх
kami
Дата 8.8.2014, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Delvish @  8.8.2014,  10:38 Найти цитируемый пост)
начиная с Vista сервисы умеют запускаться вне зависимости от регистрации пользователя.

вообще-то нет. Сервис в любом случае работает из-под пользователя, и пошло это с момента их появления. В большинстве своем этот "изподпользователь" -  LOCALSYSTEM. 
А начиная с Висты просто запретили интерактивность сервисов. Но даже интерактивному сервису совершенно необязателен был активный рабочий стол.

В любом случае - чтобы запустить приложение в оконной станции, сессии и рабочем столе пользователя - надо, чтобы этот пользователь был залогиненю

Это сообщение отредактировал(а) kami - 8.8.2014, 11:37
PM MAIL WWW   Вверх
Delvish
Дата 8.8.2014, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Извиняюсь, спутал с приложениями, запускаемыми планировщиком с возможностью выбора варианта запуска "вне зависимости от регистрации пользователя". Кстати, не так давно я поднимал схожую тему и реализовал почти так, как это предлагается в статье, приведенной Вами в первом посте этой темы, только реализовал несколько проще:

Код

function WTSQueryUserToken(SessionId : DWORD; phToken: pHandle) : bool; stdcall; external 'wtsapi32.dll';
function WTSGetActiveConsoleSessionId : DWORD; stdcall; external 'kernel32.dll';

procedure RunApp(FilePath : string);
var
   hToken : THandle;
   si     : STARTUPINFO;
   pi     : PROCESS_INFORMATION;
begin
   if WTSQueryUserToken(WtsGetActiveConsoleSessionID, @hToken) then
     begin
       ZeroMemory(@si, SizeOf(si));
       si.cb := SizeOf(si);
       si.lpDesktop := nil;
       CreateProcessAsUser(hToken, nil, PAnsiChar(FilePath), nil, nil, False, 0, nil, nil, si, pi);
       CloseHandle(hToken);
     end;
end;

PM MAIL   Вверх
kami
Дата 8.8.2014, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Delvish, увы, но этого кода мало, о чем явно говорится в ремарках MSDN, самое главное - 
Цитата

CreateProcessAsUser does not load the specified user's profile into the HKEY_USERS registry key. Therefore, to access the information in the HKEY_CURRENT_USER registry key, you must load the user's profile information into HKEY_USERS with the LoadUserProfile function before calling CreateProcessAsUser.
......
If the lpEnvironment parameter is NULL, the new process inherits the environment of the calling process. CreateProcessAsUser does not automatically modify the environment block to include environment variables specific to the user represented by hToken. For example, the USERNAME and USERDOMAIN variables are inherited from the calling process if lpEnvironment is NULL. It is your responsibility to prepare the environment block for the new process and specify it in lpEnvironment.

Отсюда - запускаемое приложение не получит нужные данные из реестра и доступ к сетевым ресурсам.

Добавлено через 58 секунд
Цитата(kami @  8.8.2014,  15:10 Найти цитируемый пост)
 не получит нужные данные из реестра

Причем - совершенно не обязательно, что приложение само будет пытаться лезть в реестр, вполне возможно туда полезут используемые dll...
PM MAIL WWW   Вверх
drkot
Дата 8.8.2014, 16:01 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(ZBugz @  8.8.2014,  07:19 Найти цитируемый пост)
1. По текущем пользователем.

Текущий это какой? Тот кто владеет терминальной сессией? или RDP сессией?
Цитата(ZBugz @  8.8.2014,  07:19 Найти цитируемый пост)
2. В той же папке где и сервис.

Речь не о местоположении файла, речь о пространстве имен. Под какой сессией, на каком рабочем столе? 
Цитата(ZBugz @  8.8.2014,  07:19 Найти цитируемый пост)
 если не войти под юзером... 

Вам наверно надо перенести функционал в сервис и всех то делов...
Или просто из сервиса выполнить shellExec и пусть себе работает

Цитата(kami @  8.8.2014,  09:13 Найти цитируемый пост)
если пользователь не залогинен

может, но смысла в этом особого нет. если только конкретный пользователь не обладает "ценными" правами (например это аккаунт на сервере баз данных MSSQL).

Цитата(Delvish @  8.8.2014,  11:38 Найти цитируемый пост)
с Vista сервисы умеют запускаться вне зависимости от регистрации пользователя

да ну что Вы говорите? а в nt4 они что ждали пока админ протрезвеет и залогинется? 

Цитата(kami @  8.8.2014,  12:34 Найти цитируемый пост)
запретили интерактивность сервисов

не запретили, а привели к "безопасному" виду. Показать окно на любом рабочем столе возможно, но окна создаваемые сервисом по умолчанию привязаны его рабочему столу.

Цитата(kami @  8.8.2014,  12:34 Найти цитируемый пост)
надо, чтобы этот пользователь был залогиненю

нет не надо. процесс от имени любого пользователя может работать в пределах любого пространства если это не запрещено политикой. изначально это не запрещено. в частности планировщик задач так и работает.


ZBugz, в вашем случае лучший и простейший вариант создать задачу в планировщике, указать там нужного пользователя и все. Подходящий триггер "При запуске".
Пока пользователь не залогинется программа будет висеть на десктопе default пользователя system, как только появится пользователь, программа перескочит на его рабочий стол.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
kami
Дата 8.8.2014, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(drkot @  8.8.2014,  16:01 Найти цитируемый пост)
а привели к "безопасному" виду. 

Окна от интерактивных сервисов в Висте показывались на отдельном рабочем столе, переключение на который происходит с использованием службы "Обнаружения интерактивных служб". В Win7 эта служба по умолчанию не в автозапуске. Сам сервис не может получить доступ к рабочему столу пользователя.

Цитата(drkot @  8.8.2014,  16:01 Найти цитируемый пост)
Показать окно на любом рабочем столе возможно, но окна создаваемые сервисом по умолчанию привязаны его рабочему столу.

Пример/ссылку возможности этого можно?
помнится, сие для меня была очень большая проблема (которую я не решил, а до сих пор хочется) - отобразить окно, созданное сервисом на десктопе пользователя, сессию которого можно получить через WTSGetActiveConsoleSessionID.


Это сообщение отредактировал(а) kami - 8.8.2014, 16:27
PM MAIL WWW   Вверх
drkot
Дата 8.8.2014, 17:32 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(kami @  8.8.2014,  17:26 Найти цитируемый пост)
Сам сервис не может получить доступ к рабочему столу пользователя

Да что вы говорите? и кто же ему помешает? 
Создавать окна с правами системы на рабочем столе терминального пользователя потенциально не безопасно, это да... так пусть разработчик думает... его предупредили...
А вот то что окна сервиса автоматически не выкидывает на терминальный рабочий стол, это да... и это правильно.

Цитата(kami @  8.8.2014,  17:26 Найти цитируемый пост)
"Обнаружения интерактивных служб"

ну... в висте много странностей было... переходный период, у всех бывает... наверно обратная совместимость требовалась, потом как основные игроки перестроились службу  отключили.

Цитата(kami @  8.8.2014,  17:26 Найти цитируемый пост)
Пример/ссылку возможности этого можно?

у Rouse_ есть пример... там как раз сервис с окнами, не помню только насколько он соответствует этой теме...
а в целом делается примерно так:
Код

  StartupInfo.lpDesktop:= 'winsta0\default';

этот параметр и определяет на какой рабочий стол будет подцеплен поток.
Создаем поток привязываем его к нужному столу
Создаем окно в контексте потока.
Оно отобразилось на нужном рабочем столе...

Единственное рабочий тол типа "logon" не принимает потоки от кого попало...



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
kami
Дата 8.8.2014, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(drkot @  8.8.2014,  17:32 Найти цитируемый пост)
этот параметр и определяет на какой рабочий стол будет подцеплен поток.

Вы утверждали, что сервис может отобразить окно на рабочем столе пользователя. StartupInfo относится к запуску отдельного процесса.
Даже если не брать это в расчет, сей параметр всего лишь определяет, какой рабочий стол будет использован. При этом рабочий стол должен принадлежать WinSta, под которым запущен процесс. Для справки - у каждой Window Station свой набор столов, по умолчанию - default. Да, Window Station можно переключать, но увы - только в рамках своей сессии. Вы не в состоянии открыть десктоп пользователя.
Итого - указание WinSta0\Default приведет к тому, что отдельный процесс будет использовать дефолтный десктоп, принадлежащий сессии родительского процесса, т.е. - сервису. А у сервисов  - отдельный, не-интерактивный десктоп.

Цитата(drkot @  8.8.2014,  17:32 Найти цитируемый пост)
Да что вы говорите? и кто же ему помешает? 

Пример в студию. Что угодно - нарисовать линию, показать окно - любое действие из сервиса в Vista|Win7, воздействующее на рабочий стол пользователя. Выше я дал пруфлинки, почему считаю это невозможным.
На всякий случай - подчеркну: непосредственно из сервиса, а не отдельного приложения, запущенного им.

Это сообщение отредактировал(а) kami - 8.8.2014, 17:50
PM MAIL WWW   Вверх
Delvish
Дата 8.8.2014, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Цитата(kami @  8.8.2014,  16:10 Найти цитируемый пост)
запускаемое приложение не получит нужные данные из реестра и доступ к сетевым ресурсам

На счет раздела HKCU я не проверял, но вот сеть работает исправно. Или под сетевыми ресурсами имеется ввиду доступ к шарам?
В общем, как это описал выше drkot, в моем случае одна программа запускается от имени Системы, ждет входа пользователя, после чего приведенным выше кодом запускает основную программу, которая работает безо всяких проблем.
Если же топикстартеру не нужно ждать логина пользователя, то планировщик, как я писал выше, позволяет запускать задачи вне зависимости от регистрации.  Ему просто нужно определиться с самой задачей smile
PM MAIL   Вверх
drkot
Дата 8.8.2014, 22:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
 должен принадлежать WinSta, под которым запущен процесс

Во первых Вы правы в своих суждениях. Но Вы движетесь по пути, который не предполагает решения. Конечно можно углубиться в права и привилегии и переключить окно с одной станции на другую, но это не тот путь...
Никто не мешает создать процесс под в нужной станции/столе, и выполнить то что нужно, при этом задав процессу права пользователя ... 
Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
принадлежащий сессии родительского процесса

в этом вопросе не могу с Вами согласится... 
Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
Пример в студию. 

я же говорю скачайте пример с сайта Rouse и не создавайте панику... Функциональный пример для этой задачи в три строчки не поместишь...
пример от Rouse
Тотя могли и сами скачать, чай не дети малые.
Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
а не отдельного приложения, запущенного им

а в чем разница? а... да... Вместо того чтобы пройти в дверь, мы по старинке пытаемся пробить стену головой... ну тут каждый выбирает по себе... извольте...


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0930 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.