Что нового

Ошибка при запуске созданной службы

VLDM

Новичок
Сообщения
7
Репутация
3
Есть свой скрипт. Создал службу командой sc, но служба не запускается.
Выдаёт ошибку 1053 Служба не ответила на запрос своевременно.

Что делать? Что изменить в своём скрипте чтобы она могла запускаться как служба?
Поиск по форуму ничего не дал, пробовал создавать и запускать службу с помощью _Services.
:(

p.s. название темы поправил, чтоб было понятнее
 
Автор
V

VLDM

Новичок
Сообщения
7
Репутация
3
Re: Запуск своей программы как служба

Я пробовал использовать как раз этот UDF, ещё и вот этот, разницы никакой, создаёт службу нормально. Дело не в этом. Это то всё работает. Просто прога как служба не запускается.

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

Жмёшь запуск службы, прога запускается, выдаёт сообщение об ошибке, и система завершает выполнение проги, думая что прога повисла или ещё что.

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

Может неправильно создаю службу?
Код:
RunWait(@SystemDir & '\sc.exe create "Service3" binPath= "' & @SystemDir & '\' & @ScriptName & ' service" start= auto')

с UDF запускаю так
Код:
_Service_Create("Service3","Service3",$SERVICE_WIN32_OWN_PROCESS,$SERVICE_AUTO_START, $SERVICE_ERROR_SEVERE, '"' & @SystemDir & '\' & @ScriptName & '"')
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
я обычно пользовался srvany для создания службы, проблем не было
 
Автор
V

VLDM

Новичок
Сообщения
7
Репутация
3
не нравится мне использовать сторонние утилиты
да ещё и в диспетчере задач не моя прога отображается
может можно как-то по другому, программным способом?
если нет, то придётся добавлять в общую автозагрузку.
 
Автор
V

VLDM

Новичок
Сообщения
7
Репутация
3
AZJIO
:wacko:
У вас блокнот, а у меня служебная программа, которая должна просто быть всегда запущена. И чтобы ни один пользователь не смог эту прогу закрыть. :mad:
У нас есть учебный класс, нужно как-то контролировать пользователей и управлять компьютерами.
Есть на данное время задача, сделать включение и выключение компов по сетке. Что и сделал.
Теперь считаю нужным, чтобы клиентская прога запускалась службой. Чтобы была незаметна для пользователей, и чтобы её нельзя было завершить обычными правами юзера.
Если добавить в автозагрузку, то естественно, прога будет запускаться под правами юзера. Отсюда возможны сбои при выключении компов, по вине обычных пользователей.
Ещё нужно на информационный терминал тоже службу, чтобы всё кроме одной запущенной проги блокировало, вырубало Explorer, доступ только ко одному сайту и всякое такое.
Многое чего ещё можно придумать для административных целей!

P.S. У меня запросы к своим прогам высокие. Пишу один раз, так чтобы потом не возвращаться к прошлым задачам!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
VLDM сказал(а):
Если добавить в автозагрузку, то естественно, прога будет запускаться под правами юзера.
А если добавить в

Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
VLDM

Прописываешь свой скрипт (скомпилированный) в

Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
(обычный пользователь не может редактировать эту ветку), а в начале самого скрипта вызываешь следующую функцию

Код:
Func _ScriptProtect()

	If (IsAdmin()) Or (Not @compiled) Then
		Return 0
	EndIf

	Local $hProcess = _WinAPI_GetCurrentProcess()
	Local $tACL = DllStructCreate('byte AclRevision;byte Sbz1;ushort AclSize;ushort AceCount;ushort Sbz2')
	Local $pACL = DllStructGetPtr($tACL)
	Local $tSD = DllStructCreate('byte[20]')
	Local $pSD = DllStructGetPtr($tSD)
	Local $Ret

	$Ret = DllCall('advapi32.dll', 'int', 'InitializeSecurityDescriptor', 'ptr', $pSD, 'dword', 1)
	If (@error) Or (Not $Ret[0]) Then
		Return 0
	EndIf
	$Ret = DllCall('advapi32.dll', 'int', 'InitializeAcl', 'ptr', $pACL, 'dword', DllStructGetSize($tACL), 'dword', 2)
	If (@error) Or (Not $Ret[0]) Then
		Return 0
	EndIf
	$Ret = DllCall('advapi32.dll', 'int', 'SetSecurityDescriptorDacl', 'ptr', $pSD, 'int', 1, 'ptr', $pACL, 'int', 0)
	If (@error) Or (Not $Ret[0]) Then
		Return 0
	EndIf
	$Ret = DllCall('advapi32.dll', 'int', 'SetKernelObjectSecurity', 'ptr', $hProcess, 'dword', 0x04, 'ptr', $pSD)
	If (@error) Or (Not $Ret[0]) Then
		Return 0
	EndIf
	Return 1
EndFunc   ;==>_ScriptProtect


Теперь этот скрипт простому смертному (не администратору) не судьба выгрузить.

:smile:
 
Автор
V

VLDM

Новичок
Сообщения
7
Репутация
3
Yashied
Благодарю!
Решено добавить в автозагрузку в реестр и попробую использовать функцию _ScriptProtect.
 
Автор
V

VLDM

Новичок
Сообщения
7
Репутация
3
Появилось одно НО ;D
У нас пользователей 2-3 штуки с каждого отдела. Естественно если пользователь не вошёл в систему то прога не запустилась :whistle:
... комп не выключится.
Так :laugh: всё таки нужно прогу запустить как службу. Желательно без дополнительных утилит.
У кого есть какие предложения? :scratch:

p.s. Вот вам и преимущества службы.
 
Автор
V

VLDM

Новичок
Сообщения
7
Репутация
3
asdf8
нееееееее, вы не так поняли
у меня с созданием службы всё нормально
сама прога не хочет работать как служба, система ожидает какого-то подтверждения что это именно служебная прога

мне нужно вот как раз реализовать этот ответ на запрос системы, что за ответ сам не пойму

хотя может и что-то в создании службы, показываю повторно код создания службы, он был выше:
Код:
_Service_Create("Service3","Service3",$SERVICE_WIN32_OWN_PROCESS,$SERVICE_AUTO_START, $SERVICE_ERROR_SEVERE, '"' & @SystemDir & '\' & @ScriptName & '"')


особо ничего такого в коде нет

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

net start'ом если запускать, пишет:
Служба не реагирует на управляющие функции.
Что за управляющие функции?? Вот как раз мне они то и нужны!

Надеюсь сейчас меня поняли. :-[

...
asdf8
пардон, посмотрел примерчик, по-моему это то что я искал, благодарю
сейчас попробую


Добавлено:
Сообщение автоматически объединено:

Во, всё круто, работает :laugh:

Особая благодарность asdf8 и Yashied
 

mrsoros

Новичок
Сообщения
19
Репутация
0
Да, пример работает. Но вот почему-то функция _Timer_GetIdleTime() в коде службы ведёт себя не адекватно. Возвращает время чуть ли не от рождества Христова. Также не пашет функция MouseMove. Есть соображения почему?


Добавлено:
Сообщение автоматически объединено:

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

mrsoros

Новичок
Сообщения
19
Репутация
0
Также не корректно отрабатывает функция MouseGetPos() в теле службы. Всегда получает одинаковые координаты. MouseGetCursor () - всегда возвращает - курсор скрытый.
 
Верх