Fixed running service under local username.
[nssm.git] / service.cpp
index 5b10233..58ca264 100644 (file)
@@ -1119,17 +1119,19 @@ int edit_service(nssm_service_t *service, bool editing) {
     Empty passwords are valid but we won't allow them in the GUI.\r
   */\r
   TCHAR *username = 0;\r
+  TCHAR *canon = 0;\r
   TCHAR *password = 0;\r
   if (service->usernamelen) {\r
     username = service->username;\r
+    if (canonicalise_username(username, &canon)) return 5;\r
     if (service->passwordlen) password = service->password;\r
-    else password = _T("");\r
   }\r
-  else if (editing) username = NSSM_LOCALSYSTEM_ACCOUNT;\r
+  else if (editing) username = canon = NSSM_LOCALSYSTEM_ACCOUNT;\r
 \r
-  if (well_known_username(username)) password = _T("");\r
+  if (well_known_username(canon)) password = _T("");\r
   else {\r
-    if (grant_logon_as_service(username)) {\r
+    if (grant_logon_as_service(canon)) {\r
+      if (canon != username) HeapFree(GetProcessHeap(), 0, canon);\r
       print_message(stderr, NSSM_MESSAGE_GRANT_LOGON_AS_SERVICE_FAILED, username);\r
       return 5;\r
     }\r
@@ -1138,10 +1140,12 @@ int edit_service(nssm_service_t *service, bool editing) {
   TCHAR *dependencies = _T("");\r
   if (service->dependencieslen) dependencies = 0; /* Change later. */\r
 \r
-  if (! ChangeServiceConfig(service->handle, service->type, startup, SERVICE_NO_CHANGE, 0, 0, 0, dependencies, username, password, service->displayname)) {\r
+  if (! ChangeServiceConfig(service->handle, service->type, startup, SERVICE_NO_CHANGE, 0, 0, 0, dependencies, canon, password, service->displayname)) {\r
+    if (canon != username) HeapFree(GetProcessHeap(), 0, canon);\r
     print_message(stderr, NSSM_MESSAGE_CHANGESERVICECONFIG_FAILED, error_string(GetLastError()));\r
     return 5;\r
   }\r
+  if (canon != username) HeapFree(GetProcessHeap(), 0, canon);\r
 \r
   if (service->dependencieslen) {\r
     if (set_service_dependencies(service->name, service->handle, service->dependencies)) return 5;\r
@@ -1623,7 +1627,7 @@ int start_service(nssm_service_t *service) {
     unsigned long error = GetLastError();\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CREATEPROCESS_FAILED, service->name, service->exe, error_string(error), 0);\r
     close_output_handles(&si);\r
-    duplicate_environment(service->initial_env);\r
+    duplicate_environment_strings(service->initial_env);\r
     return stop_service(service, exitcode, true, true);\r
   }\r
   service->process_handle = pi.hProcess;\r
@@ -1636,7 +1640,7 @@ int start_service(nssm_service_t *service) {
   if (! service->no_console) FreeConsole();\r
 \r
   /* Restore our environment. */\r
-  duplicate_environment(service->initial_env);\r
+  duplicate_environment_strings(service->initial_env);\r
 \r
   if (service->affinity) {\r
     /*\r