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

Discussion in 'WASM.WIN32' started by inshade, May 27, 2010.

  1. inshade

    inshade New Member

    Blog Posts:
    0
    Доброго времени суток форумчане.
    Хочу запустить службу программно, но ничего не выходит: функция StartService не запускат сервис. Код выполняется под учёткой админа, и плюс доступ делаю к базе данных сервисов и самому сервису с провами ALL_ACCESS.
    Вот собственно
    Code (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

    Blog Posts:
    0
    так может, StartService использовать... ?
     
  3. inshade

    inshade New Member

    Blog Posts:
    0
    Code (Text):
    1. функция StartService не запускат сервис
     
  4. ohne

    ohne New Member

    Blog Posts:
    0
    Да, так и есть, она останавливает сервис
     
  5. inshade

    inshade New Member

    Blog Posts:
    0
     
  6. deLight

    deLight New Member

    Blog Posts:
    0
    Вот вам и дешевый кокаин.. =(
     
  7. ohne

    ohne New Member

    Blog Posts:
    0
    deLight
    Похоже что так
     
  8. inshade

    inshade New Member

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

    ohne New Member

    Blog Posts:
    0
    OpenSCManager+OpenService+StartService+QueryServiceStatusEx(ожидание ServiceStatus.dwCurrentState == SERVICE_RUNNING)+2*CloseServiceHandle
     
  10. gorodon

    gorodon New Member

    Blog Posts:
    0
    Если 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

    Blog Posts:
    0
    Вызов QueryServiceConfig (пример из MSDN):
    Code (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

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

    gorodon New Member

    Blog Posts:
    0
    Код в студию и трассировку с кодами ошибок(GetLastError)
     
  14. ohne

    ohne New Member

    Blog Posts:
    0
    Вам тут точно никто не поможет
     
  15. inshade

    inshade New Member

    Blog Posts:
    0
    Code (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

    Blog Posts:
    0
    не вижу строки типа
    mov hService, eax
    -либо пропущено при "вырезании", либо...
     
  17. inshade

    inshade New Member

    Blog Posts:
    0
    Эта строка есть в самом первом сообщении, просто забыл за неё а "править сообщения" не нашёл кнопочки. Также отсутствует обьявление структуры как вы могли заметить.
     
  18. inshade

    inshade New Member

    Blog Posts:
    0
    Спасибо gorodon, твои грибы вывели меня из леса.
     
  19. gorodon

    gorodon New Member

    Blog Posts:
    0