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