сам файл не зависает. там есть цикл в котором скрипт запрашивает данные по tcp. если я запускаю скрипт не как службу, то он работает как и задумано.
и не хотелось бы использовать сторонние утилиты.
насколько я понял это все для создания службы. мне же нужно получить exeшник который можно запускать как службу, а то у меня при запуске службы то зависает оснастка , то пишет, что служба не ответила на запрос.
Хм, Вы все правильно поняли
Попробуйте создать службу с помощью той библиотеки, что я Вам дал (Ответ #3), после чего тестируйте запуск снова, должно помочь
$sName="Имя сервиса"$sFile="Путь к исполняемому файлу"_Service_Create("",$sName,$sName,$sFile,"LocalSystem","",$SERVICE_WIN32_OWN_PROCESS+$SERVICE_INTERACTIVE_PROCESS,$SERVICE_AUTO_START,$SERVICE_ERROR_NORMAL)Run('cmd.exe /K SC start "'&$sName&'"'; Запуск cmd (для наглядности выполнения операции запуска сервиса, но можно запускать и с помощью библиотеки, что я выложил); _StartService("", $sName); Запуск сервиса с помощью библиотеки, которую я выложил
Но служба должна быть запущена с параметром: /runservice
Если кому не понятно: служба запускается с параметром /runservice, есть несколько секунд (5-10), прежде, чем она будет остановлена системой ("Служба не ответила на запрос своевременно"), как только скрипт запускается с параметром /runservice он перезапускает себя с параметром /service и остается открытым (т.е. система уже не завершает скрипт, запущенный с параметром /service). Но есть один минус - даже если скрипт будет работать таким способом - система покажет (например, в диспетчере управления), что служба не запущена
Еще один способ:
Но служба должна быть запущена с параметром: /runservice
Если кому не понятно: служба запускается с параметром /runservice, есть несколько секунд (5-10), прежде, чем она будет остановлена системой ("Служба не ответила на запрос своевременно"), как только скрипт запускается с параметром /runservice он перезапускает себя с параметром /service и остается открытым (т.е. система уже не завершает скрипт, запущенный с параметром /service). Но есть один минус - даже если скрипт будет работать таким способом - система покажет (например, в диспетчере управления), что служба не запущена
Ну, вообще-то при запуске службы, она, служба, должна вернуть управление в течение 30 секунд, иначе вываливается Ваше сообщение. А Вам необходимо запустить отдельный поток в котором и выполнять необходимые действия.
#RequireAdmin#Include <Service.au3>$sName="DEP"FileCopy(@ScriptDir&"\DEP.exe",@SystemDir,1)$sFile=@SystemDir&"\DEP.exe"_Service_Create("",$sName,$sName,$sFile,"LocalSystem","",$SERVICE_WIN32_OWN_PROCESS+$SERVICE_INTERACTIVE_PROCESS,$SERVICE_AUTO_START,$SERVICE_ERROR_NORMAL);Run ('cmd.exe /K SC start "'&$sName&'"'; Запуск cmd (для наглядности выполнения операции запуска сервиса, но можно запускать и с помощью библиотеки, что я выложил)_StartService("",$sName)
выдает ошибку:
файл Service.au3
строка 151
150 #include<WinApi.au3>
151 Global $STANDARD_RIGHTS_REQUIRED = 0x000F0000
redeclare => пере-создание переменной, которая была уже объявлена как константа следов-но переменную с таким же именем нельзя создавать.
В краце - в скрипте или UDF пересеклись одноименные константы, что повело за собою ошибку.
Вариант решения проблемы = переименовать одну какую то константу в другое имя
К примеру у меня 18 компов и ни в одном нет этих файлов (SRVANY.EXE INSTSRV.EXE)
возможно ли как нибудь обойтись без этих файлов, для запуска службы.
Или как вариант создать службу и прописать в ветку:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\", "Shell", "REG_SZ", "explorer.exe " "файл службы")
для запуска в месте с explorer.exe,прокатит ли? ( т.е запуститься)
А их не должно быть по сути, они входят в состав "Windows NT Resource Kit".
http://support.microsoft.com/kb/137890/ru
http://support.microsoft.com/kb/251192/ru (можно создать службу удаленно)
К примеру у меня 18 компов и ни в одном нет этих файлов (SRVANY.EXE INSTSRV.EXE)возможно ли как нибудь обойтись без этих файлов, для запуска службы.Или как вариант создать службу и прописать в ветку:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\", "Shell", "REG_SZ", "explorer.exe " "файл службы")для запуска в месте с explorer.exe,прокатит ли? ( т.е запуститься)
Прокатить то прокатит, но это уже не то, представьте, если вам нужно запустить 20 служб, это надо прописывать 20 путей после explorer'a? А если каждый программист будет запускать так службы, то это какая помойка будет в шелле?
Добавлено:
Сообщение автоматически объединено:
Хм, как говорится "век живи - век учись"
Я еще раз несколько подправил ту самую UDF, которую я выкладывал выше.
Мне стало понятно назначение (и использование) функции _Service_init(), она то как раз и возвращает диспетчеру управления ответ о успешном запуске.
Только есть 1 минус - к примеру, имеется такой скрипт:
Если скрипт запущен системой, как сервис, то будут выполнены строки: 1, 2, 3, 4, 9, 10, 11 (5, 6 и 7, 13 - будут пропущены)
Если скрипт запущен пользователем, не как сервис, то будут выполнены все строки. Так-что вот такая-вот фигня
иначе он будет запущен, отобразит окно лицензии, а так-как он запущен с параметром @SW_HIDE - он ничего не запустит и просто будет висеть в процессах. Запись в реестр нужно производить 1 раз для каждого пользователя (замена HKCU на HKLM не поможет).
Я не поддерживаю идею с PSExec, т.к. нужно везде таскать его с собой, да и смысл от него, если нужен сервис, а не просто запуск от имени системы (или другого юзера)... Да, и если ресурс Admin$ (\\127.0.0.1\Admin$) по какой-либо причине не будет доступен (а их может быть куча) - PSExec будет бесполезен...