Ошибка Could not start the MyService service on Local Computer. Error 5: Access denied. - VB

Узнай цену своей работы

Формулировка задачи:

Проблема описана в линке http://www.relib.com/forums/topic.asp?id=847824 Я последовал совету от Messir и написал код на Си. (вернее использовал примеры от MSDN). Он практически не отличается от приведенного ранее кода на VB, с той разницей, что на Си легче работать с поинтерами. Инсталляция и удаление сервиса происходит на ура, без каких-либо осложнений.(впрочем как и в VB) А вот запуск программы... Если я запускаю сервис с помощью утилиты Services Console (помечаю сервис и делаю старт), то получаю сообщение
Листинг программы
  1. Could not start the MyService service on Local Computer.
  2. Error 5: Access denied.
Если я запускаю его через StartServiceCtrlDispatcher из главной процедуры то получаю false (запуск не удался), а GetLastError возвращает 1063. Насколько я понимаю, StartServiceCtrlDispatcher должен запустить процедуру ServiceMain которая в свою очередь должна зарегистрировать Handler процедуру (плюс запуск дополнительных процессов и т.д.). Но до этого я так и не добрался. ServiceMain так и не запускается. Вопрос в том, почему Access denied и какие флаги надо устанивливать чтобы получить доступ. Хочу заметить, что я захожу в компьютер как администратор. Да, и ещё. Я нашел несколько простых примеров на Си которые демонстрируют работу с сервисами, так они так же не работают, останавливаются на StartServiceCtrlDispatcher. Может нужен какой-то специальный доступ (логин) для запуска ?

Решение задачи: «Ошибка Could not start the MyService service on Local Computer. Error 5: Access denied.»

textual
Листинг программы
  1. #include "main.h"
  2.  
  3. void install_service();
  4. void remove_service();
  5. void usage();
  6.  
  7. static SERVICE_TABLE_ENTRY dispatch_table[] = {{SERVICE_NAME, service_main},{NULL, NULL}};
  8.  
  9. int main(int argc, char* argv[])
  10. {
  11.     if (argc>2) {
  12.         usage();
  13.     } else if (argc > 1) {
  14.         if (strcmpi(argv[1],"-install")==0) {
  15.             install_service();
  16.         } else if (strcmpi(argv[1],"-uninstall")==0) {
  17.             remove_service();
  18.         } else {
  19.             usage();
  20.         }
  21.     } else {
  22.         if (!StartServiceCtrlDispatcher(dispatch_table))
  23.             printf("failed to start %s service\n", SERVICE_NAME);
  24.     }
  25.     return GetLastError();
  26. }
  27.  
  28. void usage()
  29. {
  30.     printf("MyService [COMMAND]\n");
  31.     printf("   Commands:\n");
  32.     printf("             -install\n");
  33.     printf("             -uninstall\n");
  34. }
  35.  
  36. void install_service()
  37. {
  38.     SC_HANDLE   schService;
  39.     SC_HANDLE   schSCManager;
  40.     SERVICE_DESCRIPTION scDesc;
  41.     CHAR szPath[MAX_PATH];
  42.  
  43.     if (GetModuleFileName(NULL, szPath, sizeof(szPath)) == 0) {
  44.         printf("failed to get file path!\n");
  45.         return;
  46.     }
  47.  
  48.     schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  49.     if (schSCManager != NULL) {
  50.         schService = CreateService(schSCManager,SERVICE_NAME,SERVICE_DISPLAY_NAME,
  51.                     SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,
  52.                     SERVICE_ERROR_NORMAL,szPath,NULL,NULL,NULL,NULL,NULL);
  53.         if (schService != NULL) {
  54.             printf("%s service has been installed successfully\n",SERVICE_NAME);
  55.             scDesc.lpDescription=SERVICE_DESCRIPTION_TEXT;
  56.             ChangeServiceConfig2(schService,SERVICE_CONFIG_DESCRIPTION,&scDesc);
  57.             CloseServiceHandle(schService);
  58.         } else
  59.             printf("failed to create %s service\n",SERVICE_NAME);
  60.         CloseServiceHandle(schSCManager);
  61.     }
  62.     else
  63.         printf("failed to access service database\n");
  64. }
  65.  
  66. void remove_service()
  67. {
  68.     SC_HANDLE   schService;
  69.     SC_HANDLE   schSCManager;
  70.  
  71.     schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  72.     if (schSCManager != NULL) {
  73.         schService = OpenService(schSCManager, SERVICE_NAME, SERVICE_ALL_ACCESS);
  74.         if (schService != NULL) {
  75.             if (ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)) {
  76.                 printf("stopping %s...", SERVICE_NAME);
  77.                 Sleep(1000);
  78.                 while(QueryServiceStatus(schService,&ssStatus)) {
  79.                     if (ssStatus.dwCurrentState == SERVICE_STOP_PENDING) {
  80.                         printf("."); Sleep(500);
  81.                     }
  82.                     else
  83.                         break;
  84.                 }
  85.                 printf("\n");
  86.                 if (ssStatus.dwCurrentState == SERVICE_STOPPED)
  87.                     printf("%s successfully stopped\n",SERVICE_NAME);
  88.                 else
  89.                     printf("failed to stop %s\n",SERVICE_NAME);
  90.             }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут