#include "nssm.h"\r
\r
+bool is_admin;\r
SERVICE_STATUS service_status;\r
SERVICE_STATUS_HANDLE service_handle;\r
HANDLE process_handle;\r
SC_HANDLE open_service_manager() {\r
SC_HANDLE ret = OpenSCManager(0, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);\r
if (! ret) {\r
- log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OPENSCMANAGER_FAILED, 0);\r
+ if (is_admin) log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OPENSCMANAGER_FAILED, 0);\r
return 0;\r
}\r
\r
return 6;\r
}\r
\r
+ set_service_recovery(service, name);\r
+\r
/* Cleanup */\r
CloseServiceHandle(service);\r
CloseServiceHandle(services);\r
service_status.dwWaitHint = throttle_delay + NSSM_WAITHINT_MARGIN;\r
SetServiceStatus(service_handle, &service_status);\r
\r
- /* Try to create the exit action parameters; we don't care if it fails */\r
- create_exit_action(argv[0], exit_action_strings[0]);\r
+ if (is_admin) {\r
+ /* Try to create the exit action parameters; we don't care if it fails */\r
+ create_exit_action(argv[0], exit_action_strings[0]);\r
\r
- set_service_recovery(service_name);\r
+ set_service_recovery(0, service_name);\r
+ }\r
\r
/* Used for signalling a resume if the service pauses when throttled. */\r
throttle_timer = CreateWaitableTimer(0, 1, 0);\r
}\r
\r
/* Make sure service recovery actions are taken where necessary */\r
-void set_service_recovery(char *service_name) {\r
- SC_HANDLE services = open_service_manager();\r
- if (! services) return;\r
+void set_service_recovery(SC_HANDLE service, char *service_name) {\r
+ SC_HANDLE services = 0;\r
+\r
+ if (! service) {\r
+ services = open_service_manager();\r
+ if (! services) return;\r
\r
- SC_HANDLE service = OpenService(services, service_name, SC_MANAGER_ALL_ACCESS);\r
- if (! service) return;\r
+ service = OpenService(services, service_name, SC_MANAGER_ALL_ACCESS);\r
+ if (! service) return;\r
+ }\r
\r
SERVICE_FAILURE_ACTIONS_FLAG flag;\r
ZeroMemory(&flag, sizeof(flag));\r
log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CHANGESERVICECONFIG2_FAILED, service_name, error_string(error), 0);\r
}\r
}\r
+\r
+ if (services) {\r
+ CloseServiceHandle(service);\r
+ CloseServiceHandle(services);\r
+ }\r
}\r
\r
int monitor_service() {\r