Ошибка 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);
            }

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


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

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

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