Создать и запустить службу Windows 7 или 10 с помощью командного файла? - PullRequest
0 голосов
/ 04 сентября 2018

По этой ссылке

Как создать пользовательскую службу

вы можете создать Службу Windows с помощью Windows NT Resource Kit. Например, как показано в ссылке выше,

C:\Program Files\Resource Kit\Instsrv.exe Notepad C:\Program Files\Resource Kit\Srvany.exe

Но это не работает в Windows 7 или 10 и 64-битной платформе в этом отношении, потому что Windows NT Resource Kit недоступен для новой Windows.

Мне удалось создать службу Windows, используя этот командный файл,

sc create "MyService" binPath= "C:\Program Files (x86)\MyProg\myprog.exe" start= auto DisplayName= "My Service" obj= LocalSystem

Но он не запускает службу Windows. Когда я пытаюсь начать, я получаю это сообщение,

enter image description here

Информация в « Установить службу Windows с помощью командной строки Windows? » и « Создать службу Windows из исполняемого файла » не работает.

Как запустить службу Windows без ошибок?

1 Ответ

0 голосов
/ 18 сентября 2018

Srvany.exe - древняя программа, и, насколько мне известно, она будет работать до Windows 2003. Вы можете просто забыть, что она существовала для Windows 7/10.

Чтобы запустить / остановить службу в Windows 7/10 (я использую службу acronis) с именем службы, которое обычно сильно отличается от отображаемого имени:

Остановка работающей службы:

sc stop syncagentsrv

SERVICE_NAME: syncagentsrv
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

Запуск службы:

sc start syncagentsrv

SERVICE_NAME: syncagentsrv
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 2240
        FLAGS              :

Проверьте состояние услуги:

sc query syncagentsrv

SERVICE_NAME: syncagentsrv
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

Для создания сервиса вы хотите:

sc create "MyService" binPath="C:\Program Files (x86)\MyProg\myprog.exe" start=auto DisplayName="My Service"

Это только создает службу и добавляет запись в реестр / serviceDB. Вам нужно проверить сам исполняемый файл.

Вам не нужно obj = LocalSystem , так как это опция по умолчанию. Не ставьте пробелы между знаком равенства = и значениями!

Вы проверяли просмотрщик событий? Что это говорит, когда вы запускаете службу? Только тайм-аут? myprog.exe работает один, не будучи сервисом? Пожалуйста, ответьте на эти вопросы, и я отредактирую ответ.

Edit1 / 2 на основе комментариев, и если у вас возникнут какие-либо трудности с вышеуказанным подходом

Существует небольшая утилита под названием SrvStart (родом из Ник Розански ), но теперь она адаптирована для VS 2017 (получить srvstart.v120.zip, которую необходимо собрать). Если вы довольны старой версией и уже предоставленными exe-файлами, загрузите srvstart_run.v110.zip и скопируйте оба файла * .exe и * .dll в каталог, как указано ниже.

Скопируйте все файлы в C: \ Windows (да, в каталог Windows). Причина в том, что C: \ Windows всегда должен быть в вашем PATH, таким образом, доступным для исполняемого файла SrvStart.

Теперь создайте файл MyProg.ini:

[MyService] startup = "C: \ Program Files (x86) \ MyProg \ myprog.exe" shutdown_method = winmessage

winmessage принудительно закрывает все открытые окна при закрытии службы.

Затем поместите файл *.ini прямо в корень c:\.

Затем используйте команду:

sc create <servicename> Displayname= "<servicename>" binpath= "srvstart.exe <servicename> -c <path to srvstart config file>" start= <starttype>

В вашем случае это будет:

sc create "MyService" DisplayName="My Service" binPath="srvstart.exe MyService -c C:myprog.ini" start=auto 

Примечание: Нет обратной косой черты (\) между C: и myprog.ini, что является правильным.

Теперь проверьте ваши службы, и вы должны увидеть там имя My Service, и оно должно вести себя как служба.

Редактировать 3 - на основе комментариев от @ CodenameK

По-видимому, вам нужно скомпилировать версию srvstart 120, которую можно скомпилировать с VS2017, чтобы она работала правильно @ Win10. Единственная доступная версия - это старая версия 1.1, которая на Win10 работает некорректно.

Решение, которое работало для CodenameK, состояло в том, чтобы использовать - NSSM - Менеджер неосасывающих услуг . Для дальнейшего использования, если это кому-нибудь нужно.

...