Создание и запуск сервиса (службы).

Тема в разделе "WASM.BEGINNERS", создана пользователем inshade, 12 мар 2012.

  1. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Доброго времени суток форумчане.
    Столкнулся с такой проблемой. Создаю службу CreateService и запускаю её StartService. Но происходит ошибка ERROR_SERVICE_REQUEST_TIMEOUT.
    Вот собственно вопрос, что означает эта ошибка и как её забороть?
    Нашёл описание ошибки:
    То есть получается что exe, имя которой передаётся в параметре lpBinaryPathName функции CreateService должна вызвать StartServiceCtrlDispatcher в своём коде? Другими словами cmd.exe не можеть быть службой чтоли?
     
  2. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    нет
     
  3. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    ВНЕЗАПНО!!! *LOL*
     
  4. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Что внезапного-то и смешного? cmd.exe не цель запуска как службы с правами system, (есть более элегантные способы), а как пример exe, который не вызывает функцию StartServiceCtrlDispatcher, но "хочет быть" сервисом.
     
  5. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Ну почитайте, как пишутся службы.
     
  6. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Можно, конешно, инжектировать в cmd.exe кот, который вызывает StartServiceCtrlDispatcher. Можно поковыряться в едре и объявить произвольный процесс сервисом. Но нормального способа не существует.
     
  7. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    inshade
    Пусть запустит сам себя. Винда ждет некоторое время ответа от сервиса, если не дожидается, то завершает. За это время файл запускает сам себя (или другой файл).
     
  8. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Дык я понял что служба должна вызывать у себя в коде StartServiceCtrlDispatcher.
    Проблема решена, просто прочитав про параметр lpBinaryPathName думал что любое exe может стать службой. Мне легальная служба нужна, а так канешь чиб-чё есть 30 секунд на выполнение.
    Ursus
    Самый простой способ - это поправить в реестре ключи, отвечающие за восстановление службы, на запуск программы с параметрами и "уронить" спулера через AddPrintProvidorW

    Ещё раз повторюсь мне нужна легальная служба, и ответ от K10 #2 - самый информативный.

    up:
    Такой вопрос:"Подскажите почему MessageBox не выводит окошко, если она (функция) выполняется в коде службы?"
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    inshade
    Сервисы работают на своем отдельном рабочем столе.
    Для того, чтобы взаимодейсвовать с десктопом пользователя нужно либо в коде к нему подключаться (SetProcessWindowStation, SetThreadDesktop), либо при установке службы установить параметр dwServiceType (в свойствах службы называется "Разрешить взаимодействие с рабочим столом").

    Код (Text):
    1. SC_HANDLE CreateService(
    2.  
    3.     SC_HANDLE hSCManager,   // handle to service control manager database  
    4.     LPCTSTR lpServiceName,  // pointer to name of service to start
    5.     LPCTSTR lpDisplayName,  // pointer to display name
    6.     DWORD dwDesiredAccess,  // type of access to service
    7.     DWORD dwServiceType,    // type of service
    8.     DWORD dwStartType,  // when to start service
    9.     DWORD dwErrorControl,   // severity if service fails to start
    10.     LPCTSTR lpBinaryPathName,   // pointer to name of binary file
    11.     LPCTSTR lpLoadOrderGroup,   // pointer to name of load ordering group
    12.     LPDWORD lpdwTagId,  // pointer to variable to get tag identifier
    13.     LPCTSTR lpDependencies, // pointer to array of dependency names
    14.     LPCTSTR lpServiceStartName, // pointer to account name of service
    15.     LPCTSTR lpPassword  // pointer to password for service account
    16.    );