static int enable(BOOL enabled) { SC_HANDLE hSCManager; hSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if(hSCManager==NULL) { fprintf(stderr,"!ERROR %d opening SC manager\n",GetLastError()); return(-1); } set_service_start_type(hSCManager ,enabled ? SERVICE_AUTO_START : SERVICE_DISABLED); CloseServiceHandle(hSCManager); return(0); }
int main(int argc, char **argv) { int res=0, sauto=0, sman=0, sdis=0, show=0, depreset=0, srestart=0; char *dep = NULL; char *svcname=NULL; int argidx=1; ServiceHandle svc; WCHAR w_buf[MAX_PATH]; svcname = argv[argidx++]; while (argidx < argc) { if (!strcmp(argv[argidx], "-help")) { help(); } else if (!strcmp(argv[argidx], "-auto")) { sauto=1; } else if (!strcmp(argv[argidx], "-manual")) { sman=1; } else if (!strcmp(argv[argidx], "-restart")) { srestart=1; } else if (!strcmp(argv[argidx], "-show")) { show=1; } else if (!strcmp(argv[argidx], "-depreset")) { depreset=1; } else if (!strcmp(argv[argidx], "-dep")) { if (argidx + 1 >= argc) usage(); dep = argv[++argidx]; } else if (!strcmp(argv[argidx], "-disabled")) { sdis=1; } else if (!strcmp(argv[argidx], "-v")) { #ifdef BUILD_NUMBER printf("svccntrl.exe build %d -- %s\n", BUILD_NUMBER, __DATE__); #else printf("svccntrl.exe custom build -- %s, %s\n", __DATE__, __TIME__); #endif } else { fprintf(stderr, "Unknown option: %s\n", argv[argidx]); usage(); } argidx++; } if (argc < 3) usage(); if ( sauto + sman + sdis + show + srestart != 1 && dep == NULL && !depreset) { fprintf(stderr, "Bad combination of options.\n"); usage(); } services_init(); if (show) { enumerate_services(&show_svcs_cb, NULL); } else { _snwprintf(w_buf, MAX_PATH, L"%S", svcname); if (srestart) { res = set_service_restart_type(w_buf, FALSE); if (res != ERROR_SUCCESS) { fprintf(stderr, "Error %d updating the configuration\n", res); } } else if (dep) { ServiceHandle svc2; svc = get_svc(svcname); svc2 = get_svc(dep); if (svc == INVALID_SERVICE_HANDLE || svc2 == INVALID_SERVICE_HANDLE) { fprintf(stderr, "Invalid services: %s, %s\n", svcname, dep); } else { res = add_dependent_service(svc, svc2); if (res != ERROR_SUCCESS) fprintf(stderr, "Error %d setting dependencies\n", res); } } else if (depreset) { svc = get_svc(svcname); if (svc == INVALID_SERVICE_HANDLE) { fprintf(stderr, "Invalid service: %s\n", svcname); } else { res = reset_dependent_services(svc); if (res != ERROR_SUCCESS) fprintf(stderr, "Error %d resetting dependencies\n", res); } } else { svc = get_svc(svcname); if (svc == INVALID_SERVICE_HANDLE) { fprintf(stderr, "Invalid service: %s\n", svcname); } else { res = set_service_start_type(svc, sauto ? SERVICE_AUTO_START : sman ? SERVICE_DEMAND_START : sdis ? SERVICE_DISABLED : SERVICE_NO_CHANGE); if (res != ERROR_SUCCESS) fprintf(stderr, "There was an error setting the configuration\n"); } } } services_cleanup(); return 0; }