Проблема с запуском сервиса.

Тема в разделе "WASM.WIN32", создана пользователем inshade, 27 май 2010.

  1. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Доброго времени суток форумчане.
    Хочу запустить службу программно, но ничего не выходит: функция StartService не запускат сервис. Код выполняется под учёткой админа, и плюс доступ делаю к базе данных сервисов и самому сервису с провами ALL_ACCESS.
    Вот собственно
    Код (Text):
    1. [b].data[/b]
    2. service_status SERVICE_STATUS <>
    3. _SERVICE_STATUS struc
    4. dwSeviseType              dword ?
    5. dwCurrentState            dword ?
    6. dwControlsAccepted        dword ?
    7. dwWin32ExitCode           dword ?
    8. dwServiceSpecificExitCode dword ?
    9. dwCheckPoint              dword ?
    10. dwWaitHint                dword ?
    11. _SERVICE_STATUS ends
    12.  
    13. [b].code[/b]
    14. invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS
    15. invoke OpenService,eax,offset service_spooler, SERVICE_ALL_ACCESS
    16. mov hService,eax
    17.  
    18. invoke QueryServiceStatus,eax,offset service_status
    19.     .if service_status.dwCurrentState == 1
    20.           invoke StartServiceA,hService,0,0
    21.     .endif
    22. invoke ExitProcess,0
    Запускаемый сервис spooler (Диспетчер очереди печати).
    Вот собственно просьба => Просвятите меня тёмного
     
  2. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    так может, StartService использовать... ?
     
  3. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Код (Text):
    1. функция StartService не запускат сервис
     
  4. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Да, так и есть, она останавливает сервис
     
  5. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
     
  6. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Вот вам и дешевый кокаин.. =(
     
  7. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    deLight
    Похоже что так
     
  8. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Функция StartService выдаёт ошибку ERROR_SERVICE_DISABLED(Запуск сервиса запрещён)
    У меня установлен запуск службы "Отключено".
    То есть как я понял это в реестре указывается параметры для каждой службы.
    Эти параметры "гетаются" через QueryServiceConfig, но почему-то не получается выделить буфер под возвращаемые данные. Чтобы потом изменить и установить параметры ChangeServiceConfig.
    Но разве через эту парочку надо изменять параметры, чтобы запуск службы был разрешён? Просто все изменения в реестре вступают в силу после reboot'a, однако через панель управления службами ведь служба запускается.
    Если всё таки надо через QueryServiceConfig\ChangeServiceConfig дать разрешение на запуск службы, то подскажите как ПРАВИЛЬНО выделить память для QueryServiceConfig, выделял дофига памяти под неё и всё равно функция возвращала FALSE.
     
  9. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    OpenSCManager+OpenService+StartService+QueryServiceStatusEx(ожидание ServiceStatus.dwCurrentState == SERVICE_RUNNING)+2*CloseServiceHandle
     
  10. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Если StartService возвращает ERROR_SERVICE_DISABLED значит service start options имеет значение SERVICE_DISABLED.
    Для изменения service start options надо вызвать ChangeServiceConfig установив параметр dwStartType в SERVICE_DEMAND_START, остальные параметры функции задать нулем либо SERVICE_NO_CHANGE (см MSDN).
    После этого повторить вызов StartService.
     
  11. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Вызов QueryServiceConfig (пример из MSDN):
    Код (Text):
    1.    // Get the configuration information.
    2.  
    3.     if( !QueryServiceConfig(
    4.         schService,
    5.         NULL,
    6.         0,
    7.         &dwBytesNeeded))
    8.     {
    9.         dwError = GetLastError();
    10.         if( ERROR_INSUFFICIENT_BUFFER == dwError )
    11.         {
    12.             cbBufSize = dwBytesNeeded;
    13.             lpsc = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LMEM_FIXED, cbBufSize);
    14.         }
    15.         else
    16.         {
    17.             printf("QueryServiceConfig failed (%d)", dwError);
    18.             goto cleanup;
    19.         }
    20.     }
    21.  
    22.     if( !QueryServiceConfig(
    23.         schService,
    24.         lpsc,
    25.         cbBufSize,
    26.         &dwBytesNeeded) )
    27.     {
    28.         printf("QueryServiceConfig failed (%d)", GetLastError());
    29.         goto cleanup;
    30.     }
     
  12. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Ды понту нет вызывать QueryServiceConfig с нулевым значением буфера, чтобы получить размер под выделяемые данные. Стал бы я постить тогда здесь, еслиб всё так легко было.
    Вот RSDN
    Всё равно FALSE
     
  13. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Код в студию и трассировку с кодами ошибок(GetLastError)
     
  14. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Вам тут точно никто не поможет
     
  15. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Код (Text):
    1. .data
    2. service_spooler db "spooler",0
    3. size_of_buf dword ?
    4. hService     dword ?
    5.  
    6. .code
    7. invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS
    8. invoke OpenService,eax,offset service_spooler, SERVICE_ALL_ACCESS
    9. invoke QueryServiceStatus,eax,offset service_status
    10.    
    11.      .if service_status.dwCurrentState == 1
    12.             invoke QueryServiceConfig,hService,NULL,0,offset size_of_buf
    13.     .endif
    14. invoke ExitProcess,0
    в результате получаю ERROR_ACCESS_DENIED

    [​IMG]
     
  16. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    не вижу строки типа
    mov hService, eax
    -либо пропущено при "вырезании", либо...
     
  17. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Эта строка есть в самом первом сообщении, просто забыл за неё а "править сообщения" не нашёл кнопочки. Также отсутствует обьявление структуры как вы могли заметить.
     
  18. inshade

    inshade New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    27
    Спасибо gorodon, твои грибы вывели меня из леса.
     
  19. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301