Ошибка 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.
Решение задачи: «Ошибка 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д