Ошибка 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 (помечаю сервис и делаю старт), то получаю сообщение
Если я запускаю его через 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
Листинг программы
#include "main.h" void install_service(); void remove_service(); void usage(); static SERVICE_TABLE_ENTRY dispatch_table[] = {{SERVICE_NAME, service_main},{NULL, NULL}}; int main(int argc, char* argv[]) { if (argc>2) { usage(); } else if (argc > 1) { if (strcmpi(argv[1],"-install")==0) { install_service(); } else if (strcmpi(argv[1],"-uninstall")==0) { remove_service(); } else { usage(); } } else { if (!StartServiceCtrlDispatcher(dispatch_table)) printf("failed to start %s service\n", SERVICE_NAME); } return GetLastError(); } void usage() { printf("MyService [COMMAND]\n"); printf(" Commands:\n"); printf(" -install\n"); printf(" -uninstall\n"); } void install_service() { SC_HANDLE schService; SC_HANDLE schSCManager; SERVICE_DESCRIPTION scDesc; CHAR szPath[MAX_PATH]; if (GetModuleFileName(NULL, szPath, sizeof(szPath)) == 0) { printf("failed to get file path!\n"); return; } schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (schSCManager != NULL) { schService = CreateService(schSCManager,SERVICE_NAME,SERVICE_DISPLAY_NAME, SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,szPath,NULL,NULL,NULL,NULL,NULL); if (schService != NULL) { printf("%s service has been installed successfully\n",SERVICE_NAME); scDesc.lpDescription=SERVICE_DESCRIPTION_TEXT; ChangeServiceConfig2(schService,SERVICE_CONFIG_DESCRIPTION,&scDesc); CloseServiceHandle(schService); } else printf("failed to create %s service\n",SERVICE_NAME); CloseServiceHandle(schSCManager); } else printf("failed to access service database\n"); } void remove_service() { SC_HANDLE schService; SC_HANDLE schSCManager; schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (schSCManager != NULL) { schService = OpenService(schSCManager, SERVICE_NAME, SERVICE_ALL_ACCESS); if (schService != NULL) { if (ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)) { printf("stopping %s...", SERVICE_NAME); Sleep(1000); while(QueryServiceStatus(schService,&ssStatus)) { if (ssStatus.dwCurrentState == SERVICE_STOP_PENDING) { printf("."); Sleep(500); } else break; } printf("\n"); if (ssStatus.dwCurrentState == SERVICE_STOPPED) printf("%s successfully stopped\n",SERVICE_NAME); else printf("failed to stop %s\n",SERVICE_NAME); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д