Вверх ↑
Этот топик читают: Гость
Ответов: 48
Рейтинг: 0
#1: 2006-12-02 19:06:12 ЛС | профиль | цитата
Добрый вечер

Столкнулся с такой проблемой. Хочу одну программу запихнуть в сервисы Windows, чтобы она постоянно находилась в работе - время от времен опрашивала систему - ну это уже не важно что она будет делать. Сервис я инсталлировал, для этого использовал скрипт VBS (это не HiAsm)
Const OWN_PROCESS = 16
Const NOT_INTERACTIVE = True
Const NORMAL_ERROR_CONTROL = 2
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & strComputer & "ootcimv2")
Set objService = objWMIService.Get("Win32_BaseService")
errReturn = objService.Create("MyService" ,"MyService" ,"C:MyService.exe",OWN_PROCESS,_
NORMAL_ERROR_CONTROL,"Manual", NOT_INTERACTIVE)
Процесс появился, запускается... Но только запускается и сразу же выдает ошибку: "Служба не ответила на запрос своевременно". Отсюда напрашивается вывод: "Программа-сервис должна вернуть системе какое-то событие, что она заработала" (попробуйте поставит в сервисы блокнот - запустится, но процесс не удержится и выдаст ту же ошибку).

Кто знает что нужно сделать, чтоб написать рограмму-сервис.

P.S. Сейчас и использую заготовку Фоновое приложение Windows для создания программы.
P.P.S. Буду рад пообщаться со знающими людьми в ICQ

[size=-2]------ Добавлено в 19:06
Вот например в .NET это особый модуть - прямо сервис создает...
http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/vbcon/html/vbwlkWalkthroughCreatingWindowsServiceApplication.asp
Я думаю что пока HiAsm не умеет сервисы делать :-(
карма: 0

0
Ответов: 2125
Рейтинг: 159
#2: 2006-12-02 19:42:26 ЛС | профиль | цитата
littlebob писал(а):
1. Лyчше всего это делать под аккаyнтом админа, тогда пpи любом дpyгом аккаунте созданный сервис бyдет пpодолжать работать.
2. Скопиpyйте файлы instsrv.exe и srvany.exe в какyю-нибyдь системнyю диpектоpию, напpимеp, в winntsystem32 (берутся из Resource Kit compmgmt.cab - srvany.exe, instsrv.exe. Ещё есть srvinstw - это GUI пошаговая оболочка делающая то же, что и instsrv, но ещё и может работать удаленно).
3. Запyскаете из командной стpоки: instsrv MyService c:<полный_пyть>srvany.exe, где MyService -- пpидyманное вами имя вновь созданного сеpвиса. Если в имени имеются пpобелы, то имя сеpвиса необходимо заключить в кавычки.
4. Тепеpь надо сконфигypиpовать этот сеpвис. Идёте в: Start->Settings->ControlPanel->Services, находите свой новосозданный сеpвис и щёлкаете на нём 2 pаза левой кнопкой мышки. В откpывшемся окошке отмечаете, каким способом ваш сеpвис бyдет запyскаться: Automatic - бyдет запyскаться автоматически пpи загpyзки компьютеpа, Manual - бyдет запyскаться только, когда вpyчнyю запyстите, Disabled -- совсем не бyдет запyскаться. Если хотите видеть запущенный сеpвис в виде окна на десктопе, то отметьте чек-бокс "Allow Service to Interact with Desktop".
5. Запyскаете regedt32 и создаёте key "Parameters" (без кавычек) в:
HKLMSYSTECurrentControlSetService<Имя_Вашего_сеpвиса>
6. Создаёте под созданным вами ключом "Parameters" (без кавычек) value "Application" (без кавычек) тип - REG_SZ: и пpописываете там полный пyть к исполняемомy файлy.
Напpимеp, Application: REG_SZ: c:<полный_пyть> -mail.cmd
7. Пеpезагpyжаете компьютеp или стартуете сервис вручную. Выходить из таких сеpвисов лyчше по флагy.
Необходимые файлы из Resource Kit можно взять здесь: http://www.chem.univ.kiev.ua/~adsh/win2k/s...t/inst_serv.zip (22Kb)
Также можно воспользоваться программой AppToService от basta computing - http://www.basta.com/Software/AppToService.zip 29k (бывший ServiceIt).

Вычитал на сайте eManual.ru


А нормальный сервис перво-наперво регистрирует сначала callback (вызывая RegisterServiceCtrlHandler), чтобы получать информацию от SCM (например о том, что сервис должен завершиться, приостановиться и т.п.), перед инициализацией (вот оно главное) сообщить о своём статусе (SetServiceStatus/SERVICE_START_PENDING), и после инициализации тоже (SERVICE_RUNNING). Если через несколько секунд после старта сервиса не придёт сообщение о статусе SERVICE_RUNNING, приложение/сервис убивается.
карма: 1

0
Ответов: 48
Рейтинг: 0
#3: 2006-12-02 19:49:58 ЛС | профиль | цитата
tsdima, Ты меня не понял! Я знаю как зарегистрировать сервис - скрипт как раз выполняет все что ты процитировать. Я прошу подсказать возможно ли создать программу-сервис на HiAsm
карма: 0

0
Ответов: 2125
Рейтинг: 159
#4: 2006-12-02 19:52:47 ЛС | профиль | цитата
srvany.exe


А вообще этот вопрос давно следовало поднять. То, что сейчас в HiAsm зовётся сервисом, это лишь фоновое приложение без окон. А сделать нормальный сервис, вроде-бы, несложно. Сложно его отлаживать.
карма: 1

0
Ответов: 48
Рейтинг: 0
#5: 2006-12-02 20:48:46 ЛС | профиль | цитата
tsdima, В асе поговорим? Ты создавал сервисы?
Я к сожалению сейчас не могу проверить srvany.exe - я дома, а ResKit я на ноут себе не захотел ставить... может и зря, ведь мне руководитель говорил: "Установи". Ладно, я на работе проверю. Хотя меня терзают смутные сомнения, что это изобретение велосипеда. Запускать свою прогу через посредника... Лучше бы сразу все события оговорить в своей проге. В общем я пришел к такому выводу, что на HiAsm сервис написать не получится...

[size=-2]------ Добавлено в 20:48
вообще-то моя прога тоже посредник.
Задумка: программа висит в процессах и через определенные промежутки времени запускает скрипт (сейчас это реализовано через TaskManager, а не через сервис). Сам же этот процесс можно контролировать из другой программы-менеджера с интерфейсом, то есть останавливать сервис и запускать.

Программа-менеджер
  --> База данных
  --> Программа-сервис --> Скрипт опроса и управления

то есть программа-менеджер обрастает модулями (раньше только просмотр БД был, потом редактирование, сейчас управление процессом)
Я боюсь скрипт управления помещать в программу, так как точно не известно как написаны компоненты, если случится глюк на сервере, то это очень печально будет для меня и для предприятия.
карма: 0

0
Ответов: 2125
Рейтинг: 159
#6: 2006-12-03 14:46:28 ЛС | профиль | цитата
Vitaliy писал(а):
сейчас это реализовано через TaskManager, а не через сервис
А что, Task Scheduler это не сервис, по твоему, что-ли? Задачу надо ставить по другому - научиться управлять задачами Task Scheduler-а. А для этого, насколько я знаю, есть at.exe
c:>at /?[/code]
карма: 1

0
Ответов: 48
Рейтинг: 0
#7: 2006-12-04 07:56:41 ЛС | профиль | цитата
tsdima, Еще раз повторяю, что мне не нужен планировщик! Мне нужно написать собственный сервис, а как управляться с планировщиком я сам могу научить кого угодно :-P

sCommand = "Notepad.exe"
sComputer = "MyComp"
set oShell = wscript.createobject("wscript.shell")
sTime = Hour(Time) & ":" & Minute(Time)+2
sCommand = "at \\" & sComputer & " " & sTime & " """ & sCommand & """"
oShell.Run sCommand
или
'==== Script Information Header ====
'script name:	AT-Command_wmi.vbs
'date: 04.11.06
'autor: Bochkarev Vitaly
'description: Создает задание на удаленном компьютере на запуск указанной команды через 2 минуты от текущего времени
'==== Script Main Logic ====
'Creating command line
sCommand = "Notepad.exe"
'Entering a computer name
sComputer = Inputbox ("Введите имя компьютера на который необходимо установить программу",_
[tab]"Удаленная установка программы","BOR0000")
if sComputer = "" or sComputer = "BOR0000" then
wscript.echo "Computer name is not correct"
wscript.quit
end if
' Connecting to remote computer Windows Management Instrumentarium service
Set oWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & sComputer & "\root\cimv2")
' Connecting to TimeZone object
set oColTime = oWMIService.ExecQuery("Select * from Win32_TimeZone")
' Getting information about selected time zone on the computer
For Each item In oColTime
iLocalBias = item.Bias
Next
'Making Start time for the job: "YYYYMMDDHHMMSS.MMMMMM(+-)OOO"
' Creating OOO
select case Len(cStr(Abs(iLocalBias)))
case "0"
wscript.echo "Error! No information about remote computer time settings."
wscript.quit
case "1"
sLocalBias = "00" & cStr(Abs(iLocalBias))
case "2"
sLocalBias = "0" & cStr(Abs(iLocalBias))
case else
sLocalBias = cStr(Abs(iLocalBias))
end select
' Creating (+-)OOO
if iLocalBias >= 0 then
sOOO = "+" & sLocalBias
else
sOOO = "-" & sLocalBias
end if
' Creating YYYYYMMDDHHMMSS.MMMMMM (2 minutes to delay the task)
if Len(cStr((Minute(Time) + 2))) = 1 then
sMM = "0" & cStr(Minute(Time) + 2)
else
sMM = cStr(Minute(Time) + 2)
end if
if Len(cStr(Hour(Time))) = 1 then
sHH = "0" & cStr(Hour(Time))
else
sHH = cStr(Hour(Time))
end if
sYYYYYMMHHMMSS = "********" & sHH & sMM & "00.000000"
' Creating start time
sStartTime = sYYYYYMMHHMMSS & sOOO
' Connecting to ScheduledJob object
Set oJob = oWMIService.Get("Win32_ScheduledJob")
'Setting the task
errJobCreated = objNewJob.Create (sCommand, sStartTime, False , , , False, JobID)
'help for method Create(Command, Time, RunRepeatedly, DaysOfWeek to run, DaysOfMonth to run, InteractWithDesktop, JobID)
if errJobCreated = 0 then
Wscript.Echo "The job was successfully set on " & sComputer
else
Wscript.Echo "Error! The job has not been set."
end if
карма: 0

0
Ответов: 2125
Рейтинг: 159
#8: 2006-12-04 13:28:46 ЛС | профиль | цитата
Vitaliy, ладно, вот тебе заготовка, я сам не проверял (лень коверкать систему), проверишь - о результатах сообщи.

Удалено.
карма: 1

0
Ответов: 48
Рейтинг: 0
#9: 2006-12-04 16:07:08 ЛС | профиль | цитата
tsdima, протестировал. Тот же результат. Мне надо б архив сюда прикрепить. как это сделать, чтоб тебе показать?

Напишу блоками-код. Если админ против, то решим после по-другому.

Устанавливаем сервис запуском скрипта (он будет в ручном режиме). Заходим в консоль управления. Находим сервис "Test". Запускаем его, но он не запускается - дергается и останавливается.

Пояснение к кодам.
1 - HiAsm - сам сервис
2 - VisualBasicScript - скрипт-установщик сервиса
3 - VisualBasicScript - скрипт-деинсталлятор сервиса

Справка к Win32_BaseService https://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/create_method_in_class_win32_baseservice.asp
карма: 0

0
файлы: 3code_677.txt [577B] [336], code_678.txt [516B] [333], code_679.txt [516B] [330]
Ответов: 16884
Рейтинг: 1239
#10: 2006-12-04 16:10:22 ЛС | профиль | цитата
Vitaliy, если в сообщении несколько тегов CODE то они не сворачиваются в code_ХХХ. Нужно все толкать в один
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 48
Рейтинг: 0
#11: 2006-12-04 16:11:11 ЛС | профиль | цитата
Tad, это 3 разных программы
карма: 0

0
Ответов: 2125
Рейтинг: 159
#12: 2006-12-04 16:39:51 ЛС | профиль | цитата
Vitaliy писал(а):
Тот же результат

Ха! Он ожидал, что ни разу не протестированный код сразу заработает
Я и сам не удержался и запустил. Вобщем, там всё неправильно.

Вот новый вариант. Запускаться-то запускается, а вот остановить - никак, видимо, нужно всё-таки свой make_ntsvc писать, возможно, цикл прокачки сообщений каким-то боком мешает или ещё что, пока не знаю - задолбался перезагружаться. Для работы нужно по onInit новый Thread запускать.

[size=-2]------ Добавлено в 16:39
Vitaliy писал(а):
скрипт-деинсталлятор

Ну и который из них деинсталлятор?
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#13: 2006-12-04 16:40:52 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2024-10-03 17:22:08
карма: 0

0
Ответов: 2125
Рейтинг: 159
#14: 2006-12-04 17:11:07 ЛС | профиль | цитата
Поскольку Vitaliy не выложил скрипт деинсталляции, пришлось самому писать:
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objService = objWMIService.ExecQuery("select * from Win32_BaseService where Name='MyService'")
For Each x in objService
MsgBox x.Delete
Next
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#15: 2006-12-04 19:31:06 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2024-10-03 17:22:08
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)