Определить работает служба или нет!?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Определить работает служба или нет!?
Возникла мелкая проблема отслеживания запущенного приложения. Если он запущено обычным способом, то через FindWindow это обнаруживается а если оно запущено как служба ? Окна нет - есть запись в реестре о зарегеном сервисе но вот его стаутс получить где? Нашел давний пример работы приложения как сервиса, но не хочется его тащить за собой. Кто знает чего попроще?
С6.3
С6.3
Re: Определить работает служба или нет!?
давно такая задача была, вот код определения:
Код: Выделить всё
CalcServiceStatus FUNCTION
Computer CSTRING(20)
SCMHandle UNSIGNED
SrvHandle UNSIGNED
SrvName CSTRING(50)
DspName CSTRING(50)
ExeFile CSTRING(255)
SrvDb CSTRING(50)
loc_i LONG
loc_status LIKE(SERVICE_STATUS)
FilesOpened LONG
CODE
ExeFile = COMMAND('0')
LOOP loc_i = LEN(CLIP(ExeFile)) TO 1 BY -1
IF ExeFile[loc_i] = '\'
ExeFile = ExeFile[1 : loc_i] & 'srvsita.exe'
BREAK
END
END
Computer=''
GetModuleFileName(SYSTEM{PROP:AppInstance},ExeFile,SIZE(ExeFile))
ExeFile=CLIP(ExeFile)&' /SRV='&PATH()
SrvName=CLIP(EQU:SERVICENAME)
DspName=CLIP(EQU:DISPLAYNAME)
SrvDB='ServicesActive'
SCMHandle=OpenSCManager(Computer,SrvDB,SC_MANAGER_CREATE_SERVICE+STANDARD_RIGHTS_REQUIRED)
IF ~SCMHandle
Message('Unable to open Service manager - check your rights','Error!',icon:hand)
RETURN(1)
END
SrvHANDLE = OpenService(SCMHandle,SrvName,SERVICE_ALL_ACCESS)
IF ~SrvHANDLE
! Message('Failed to Open Service','Error!',icon:hand)
Do Return1
END
IF ~QueryServiceStatus(SrvHANDLE,ADDRESS(loc_status))
Message('Failed to QueryServiceStatus','Error!',icon:hand)
Do Return1
END
Do Return0
RETURN(0)
Return1 ROUTINE
Do CloseAll
RETURN(1)
Return0 ROUTINE
Do CloseAll
RETURN(CHOOSE(loc_status.dwCurrentState = SERVICE_RUNNING,0,1))
CloseAll ROUTINE
IF SrvHANDLE
CloseServiceHandle(SrvHANDLE)
END
IF SCMHandle
CloseServiceHandle(SCMHandle)
END
Re: Определить работает служба или нет!?
Код похож на тот пример что я видел по работе программы как сервиса (только менее нагружен). Типа открыли базу сервисов, нашли по имени нужный , проверили статус.
Сразу налетел на то что если нет админ привлегий то проверить запущен сервис или нет нельзя, если это не обойти то и смысла проверять нет так как пользователь однозначно будет работать под обычным профилем. Идея в том чтобы убедиться что необходимая для взаимодействия с нашим приложением программа запущена и нет необходимости ее запускать. А эта программа может работать просто как приложение и как сервис на наше усмотрение (и тогда нужно отказаться от варианта сервиса).
PS. Не понял для какой цели здесь GetModuleFileName я вроде хочу проверить не свою программу!?
SC помогает, но никак результат из черного окошка не захватить чтобы пользователь успел прочесть! А команда перенаправления в файл (в DOS такая была не проходит так как здесь уже видимо cmd а не command.com)
Сразу налетел на то что если нет админ привлегий то проверить запущен сервис или нет нельзя, если это не обойти то и смысла проверять нет так как пользователь однозначно будет работать под обычным профилем. Идея в том чтобы убедиться что необходимая для взаимодействия с нашим приложением программа запущена и нет необходимости ее запускать. А эта программа может работать просто как приложение и как сервис на наше усмотрение (и тогда нужно отказаться от варианта сервиса).
PS. Не понял для какой цели здесь GetModuleFileName я вроде хочу проверить не свою программу!?
SC помогает, но никак результат из черного окошка не захватить чтобы пользователь успел прочесть! А команда перенаправления в файл (в DOS такая была не проходит так как здесь уже видимо cmd а не command.com)
- Игорь Столяров
- Ветеран движения
- Сообщения: 8034
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
Re: Определить работает служба или нет!?
В свое время была такая же задача - решили не заморачиваться и сделать просто и тупо:
- Если сервис работает, он проверяет раз в 5 секунд флаг (например в реестре) и если он не установлен, то устанавливает его.
- Приложение снимает флаг и ждет тайм-аут, если его не кто не установил - значит сервис не работает и программа его запускает.
Потом в качестве флага еще стали записывать еще и код состояния сервиса (ожидание, обработка и т.д.)
Все. Работает уже много лет без всяких проблем.
P/S: Пример описанный ниже конечно более интересен с точки зрения программирования ...
- Если сервис работает, он проверяет раз в 5 секунд флаг (например в реестре) и если он не установлен, то устанавливает его.
- Приложение снимает флаг и ждет тайм-аут, если его не кто не установил - значит сервис не работает и программа его запускает.
Потом в качестве флага еще стали записывать еще и код состояния сервиса (ожидание, обработка и т.д.)
Все. Работает уже много лет без всяких проблем.
P/S: Пример описанный ниже конечно более интересен с точки зрения программирования ...

Make Clarion Great Again ! 
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: Определить работает служба или нет!?
Ерунда, всё прекрасно выводится в файл:seawolf писал(а): SC помогает, но никак результат из черного окошка не захватить чтобы пользователь успел прочесть! А команда перенаправления в файл (в DOS такая была не проходит так как здесь уже видимо cmd а не command.com)
net start > d:\netstart.txt
выдаёт вот что:
Запущены следующие службы Windows:
ADSM Service
ATKGFNEX Service
DHCP-клиент
DNS-клиент
KtmRm для координатора распределенных транзакций
Norton 360
NVIDIA Display Driver Service
а
sc.exe query ALG > d:\sc.txt
SERVICE_NAME: ALG
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
разобрать как 2 байта. Только учесть что net start выдаёт полные имена, а sc требует короткое.
С уважением, ДП
Re: Определить работает служба или нет!?
Вывод в файл проходит из DOS сессии это я сразу увидел и решил что вот сейчас -то я файл сделаю и разберу его из проги. Но если в программе сформировать строку и дать run или сделать это -же самое через ShellExecute то не работает, просто выбрасывает в окно со списком возможных команд sc.
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: Определить работает служба или нет!?
Вот так работаетseawolf писал(а):Вывод в файл проходит из DOS сессии это я сразу увидел и решил что вот сейчас -то я файл сделаю и разберу его из проги. Но если в программе сформировать строку и дать run или сделать это -же самое через ShellExecute то не работает, просто выбрасывает в окно со списком возможных команд sc.
Код: Выделить всё
RUN('command.com /c sc.exe query ALG > d:\sc.txt')
С уважением, ДП
Re: Определить работает служба или нет!?
Вот как-то не до пер, что надо command.com написать сначала, а я sc ... и так далее. Видимо путь решения проблемы есть !
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Определить работает служба или нет!?
в том коде маска доступа для OpenSCManager указана
нужно меньший доступ запрашивать, а именно: READ_CONTROL + SC_MANAGER_CONNECT
READ_CONTROL - стандартное чтение
SC_MANAGER_CONNECT - для подключения
SC_MANAGER_ENUMERATE_SERVICE - для перечисления служб, то есть если имя известно, то не нужно
а маска доступа для OpenService тоже "админская"
А надо: READ_CONTROL + SERVICE_QUERY_STATUS
При этих масках - если работают <Net Start ...> и <sc ...> - то сработает и данный код в твоей проге
Всё просто и красиво! и не нужны!!! никакие навороты с RUN или SHELLEXECUTE и т.д. и т.п.
а это и неправильно - оттого под неадмином и не прётSC_MANAGER_CREATE_SERVICE+STANDARD_RIGHTS_REQUIRED
нужно меньший доступ запрашивать, а именно: READ_CONTROL + SC_MANAGER_CONNECT
READ_CONTROL - стандартное чтение
SC_MANAGER_CONNECT - для подключения
SC_MANAGER_ENUMERATE_SERVICE - для перечисления служб, то есть если имя известно, то не нужно
а маска доступа для OpenService тоже "админская"
ВОТ ОНО И НЕ ПРЁТ ПОД ЮЗЕРОМSERVICE_ALL_ACCESS
А надо: READ_CONTROL + SERVICE_QUERY_STATUS
При этих масках - если работают <Net Start ...> и <sc ...> - то сработает и данный код в твоей проге

Всё просто и красиво! и не нужны!!! никакие навороты с RUN или SHELLEXECUTE и т.д. и т.п.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: Определить работает служба или нет!?
Какое-то извращённое понятие красотыWadimZapara писал(а): Всё просто и красиво! и не нужны!!! никакие навороты с RUN или SHELLEXECUTE и т.д. и т.п.

С уважением, ДП
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Определить работает служба или нет!?
Возможно, я извращенец, но вместо RUN всегда использую свою процедуру через CreateProcess и тащусь от красоты...Дед Пахом писал(а):Какое-то извращённое понятие красотыВместо одной строчки RUN и 3-х для разбора текстового файла наворотить кучу кода с WinAPI, запутавшись в масках привилегий и т.д.


Компьютер имеет то преимущество перед мозгом, что им пользуются...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Определить работает служба или нет!?
А никто и не думал ругатьсяseawolf писал(а):Ну-ка не ругайтесь!!!!!

Запуск через RUN мне претит. А обмен через временные дисковые файлы - не для меня (по крайней мере - когда есть другой путь).

А ты, МорскойВолк, лучше скажи - помогло?
И, "кстати о птичках", там где работает SC.EXE правильнее вызывать не COMMAND.COM, а CMD.EXE.
А его (SC.EXE) на WinNT, Win2k - нету.


Компьютер имеет то преимущество перед мозгом, что им пользуются...
Re: Определить работает служба или нет!?
CreateProcess вещь хорошая на нее перейду обязательно, особенно там где надо толкать исполняемые файлы. Касаемо данного вопроса пока работает через run. Клиентам прога не ставится так что это вполне терпимо, заоодно узнал много про sc.