hashicorp/nomad · error

unable to create service - %w

Error message

unable to create service - %w

What it means

Returned by serviceInstall when WindowsServiceManager.CreateService fails to register a new Nomad Windows service (the registry showed no existing one). The service could not be created with the supplied binary path and configuration.

Source

Thrown at command/windows_service_install.go:224

		if err := srvc.Configure(winsvc.WindowsServiceConfiguration{
			StartType:      winsvc.StartAutomatic,
			DisplayName:    winsvc.WINDOWS_SERVICE_DISPLAY_NAME,
			Description:    winsvc.WINDOWS_SERVICE_DESCRIPTION,
			BinaryPathName: cmd,
		}); err != nil {
			return fmt.Errorf("unable to configure service - %w", err)
		}
	} else {
		srvc, err = m.CreateService(winsvc.WINDOWS_SERVICE_NAME, opts.binaryPath,
			winsvc.WindowsServiceConfiguration{
				StartType:      winsvc.StartAutomatic,
				DisplayName:    winsvc.WINDOWS_SERVICE_DISPLAY_NAME,
				Description:    winsvc.WINDOWS_SERVICE_DESCRIPTION,
				BinaryPathName: cmd,
			},
		)
		if err != nil {
			return fmt.Errorf("unable to create service - %w", err)
		}
		defer srvc.Close()
	}

	// Enable the service in the Windows eventlog
	if err := srvc.EnableEventlog(); err != nil {
		return fmt.Errorf("could not configure eventlog - %w", err)
	}

	// Ensure the service is stopped
	if err := srvc.Stop(); err != nil {
		return fmt.Errorf("could not stop service - %w", err)
	}

	// Start the service so the new binary is in use
	if err := srvc.Start(); err != nil {
		return fmt.Errorf("could not start service - %w", err)
	}

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Run the install from an elevated (Administrator) shell
  2. If a stale entry exists, `sc.exe delete nomad`, reboot, and retry
  3. Check the chained %w cause for the exact SCM error code
  4. Ensure sufficient free disk space and a valid binary path

Example fix

// before
PS> nomad windows install
unable to create service - Access is denied
// after
PS (admin)> nomad windows install
Defensive patterns

Strategy: try-catch

Validate before calling

if !isAdmin() {
	log.Fatal("creating the Nomad service requires an elevated shell")
}
out, _ := exec.Command("sc.exe", "query", "nomad").CombinedOutput()
log.Printf("service pre-check: %s", out)

Try / catch

srvc, err = m.CreateService(winsvc.WINDOWS_SERVICE_NAME, opts.binaryPath, cfg)
if err != nil {
	if errors.Is(err, windows.ERROR_SERVICE_EXISTS) {
		// fall back to the GetService/Configure update path
	}
	return fmt.Errorf("unable to create service - %w", err)
}

Prevention

When it happens

Trigger: Creating the Windows service 'Nomad' fails: ERROR_ACCESS_DENIED without elevation, service name already exists but the earlier check missed it, or disk full / invalid parameters.

Common situations: Non-elevated install attempt; leftover service entry deleted-but-pending (marked for deletion); security software blocking service creation.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/2e12df44accb8120. Report an issue: GitHub.