Страница 1 из 1

Определить работает служба или нет!?

Добавлено: 21 Январь 2010, 19:38
seawolf
Возникла мелкая проблема отслеживания запущенного приложения. Если он запущено обычным способом, то через FindWindow это обнаруживается а если оно запущено как служба ? Окна нет - есть запись в реестре о зарегеном сервисе но вот его стаутс получить где? Нашел давний пример работы приложения как сервиса, но не хочется его тащить за собой. Кто знает чего попроще?

С6.3

Re: Определить работает служба или нет!?

Добавлено: 21 Январь 2010, 21:57
Дед Пахом
"net start" или sc.exe не годится?

Re: Определить работает служба или нет!?

Добавлено: 22 Январь 2010, 10:21
Andrew™
давно такая задача была, вот код определения:

Код: Выделить всё

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: Определить работает служба или нет!?

Добавлено: 22 Январь 2010, 15:25
seawolf
Код похож на тот пример что я видел по работе программы как сервиса (только менее нагружен). Типа открыли базу сервисов, нашли по имени нужный , проверили статус.
Сразу налетел на то что если нет админ привлегий то проверить запущен сервис или нет нельзя, если это не обойти то и смысла проверять нет так как пользователь однозначно будет работать под обычным профилем. Идея в том чтобы убедиться что необходимая для взаимодействия с нашим приложением программа запущена и нет необходимости ее запускать. А эта программа может работать просто как приложение и как сервис на наше усмотрение (и тогда нужно отказаться от варианта сервиса).

PS. Не понял для какой цели здесь GetModuleFileName я вроде хочу проверить не свою программу!?
SC помогает, но никак результат из черного окошка не захватить чтобы пользователь успел прочесть! А команда перенаправления в файл (в DOS такая была не проходит так как здесь уже видимо cmd а не command.com)

Re: Определить работает служба или нет!?

Добавлено: 23 Январь 2010, 9:28
Игорь Столяров
В свое время была такая же задача - решили не заморачиваться и сделать просто и тупо:
- Если сервис работает, он проверяет раз в 5 секунд флаг (например в реестре) и если он не установлен, то устанавливает его.
- Приложение снимает флаг и ждет тайм-аут, если его не кто не установил - значит сервис не работает и программа его запускает.
Потом в качестве флага еще стали записывать еще и код состояния сервиса (ожидание, обработка и т.д.)
Все. Работает уже много лет без всяких проблем.

P/S: Пример описанный ниже конечно более интересен с точки зрения программирования ... ;)

Re: Определить работает служба или нет!?

Добавлено: 23 Январь 2010, 11:20
Дед Пахом
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: Определить работает служба или нет!?

Добавлено: 23 Январь 2010, 15:09
seawolf
Вывод в файл проходит из DOS сессии это я сразу увидел и решил что вот сейчас -то я файл сделаю и разберу его из проги. Но если в программе сформировать строку и дать run или сделать это -же самое через ShellExecute то не работает, просто выбрасывает в окно со списком возможных команд sc.

Re: Определить работает служба или нет!?

Добавлено: 23 Январь 2010, 16:01
Дед Пахом
seawolf писал(а):Вывод в файл проходит из DOS сессии это я сразу увидел и решил что вот сейчас -то я файл сделаю и разберу его из проги. Но если в программе сформировать строку и дать run или сделать это -же самое через ShellExecute то не работает, просто выбрасывает в окно со списком возможных команд sc.
Вот так работает

Код: Выделить всё

RUN('command.com /c sc.exe query ALG > d:\sc.txt')
можно и в bat-файл завернуть и дёргать его.

Re: Определить работает служба или нет!?

Добавлено: 23 Январь 2010, 21:14
seawolf
Вот как-то не до пер, что надо command.com написать сначала, а я sc ... и так далее. Видимо путь решения проблемы есть !

Re: Определить работает служба или нет!?

Добавлено: 05 Февраль 2010, 0:59
WadimZapara
в том коде маска доступа для OpenSCManager указана
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 ...> - то сработает и данный код в твоей проге :wink:
Всё просто и красиво! и не нужны!!! никакие навороты с RUN или SHELLEXECUTE и т.д. и т.п.

Re: Определить работает служба или нет!?

Добавлено: 05 Февраль 2010, 11:58
Дед Пахом
WadimZapara писал(а): Всё просто и красиво! и не нужны!!! никакие навороты с RUN или SHELLEXECUTE и т.д. и т.п.
Какое-то извращённое понятие красоты :D Вместо одной строчки RUN и 3-х для разбора текстового файла наворотить кучу кода с WinAPI, запутавшись в масках привилегий и т.д.

Re: Определить работает служба или нет!?

Добавлено: 08 Февраль 2010, 2:10
WadimZapara
Дед Пахом писал(а):Какое-то извращённое понятие красоты :D Вместо одной строчки RUN и 3-х для разбора текстового файла наворотить кучу кода с WinAPI, запутавшись в масках привилегий и т.д.
Возможно, я извращенец, но вместо RUN всегда использую свою процедуру через CreateProcess и тащусь от красоты... :D А в масках доступа запутался не я, но может запутаться каждый, кто невнимательно почитал доки или понадеялся на готовый код... :wink:

Re: Определить работает служба или нет!?

Добавлено: 08 Февраль 2010, 10:58
seawolf
Ну-ка не ругайтесь!!!!! :twisted:

Re: Определить работает служба или нет!?

Добавлено: 09 Февраль 2010, 0:23
WadimZapara
seawolf писал(а):Ну-ка не ругайтесь!!!!! :twisted:
А никто и не думал ругаться :lol:
Запуск через RUN мне претит. А обмен через временные дисковые файлы - не для меня (по крайней мере - когда есть другой путь). :wink:
А ты, МорскойВолк, лучше скажи - помогло?

И, "кстати о птичках", там где работает SC.EXE правильнее вызывать не COMMAND.COM, а CMD.EXE.
А его (SC.EXE) на WinNT, Win2k - нету. :( Поэтому SC.EXE через RUN - считаю неверным в корне. :wink:

Re: Определить работает служба или нет!?

Добавлено: 15 Февраль 2010, 10:24
seawolf
CreateProcess вещь хорошая на нее перейду обязательно, особенно там где надо толкать исполняемые файлы. Касаемо данного вопроса пока работает через run. Клиентам прога не ставится так что это вполне терпимо, заоодно узнал много про sc.