hashicorp/nomad · error
cannot detect Windows ProgramData path
Error message
cannot detect Windows ProgramData path
What it means
The winsvc helper cannot determine the Windows ProgramData directory for a Windows service environment. It first checks the ProgramData environment variable, and falls back to reading the registry value HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\ProgramData. If both are empty, it records this error in w.loadErr, and the first call that touches the path map returns it.
Source
Thrown at helper/winsvc/path_windows.go:183
w.SystemDrive = os.Getenv("SystemDrive")
if w.SystemDrive == "" {
w.loadErr = fmt.Errorf("cannot detect Windows SystemDrive path")
return
}
w.SystemRoot = strings.ReplaceAll(os.Getenv("SystemDrive"), "SystemDrive", w.SystemDrive)
w.ProgramData = os.Getenv("ProgramData")
if w.ProgramData == "" {
pdKey, err := registry.OpenKey(registry.LOCAL_MACHINE,
`SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList`, registry.QUERY_VALUE)
if err == nil {
if pdVal, _, err := pdKey.GetStringValue("ProgramData"); err == nil {
w.ProgramData = pdVal
}
}
}
if w.ProgramData == "" {
w.loadErr = fmt.Errorf("cannot detect Windows ProgramData path")
return
}
w.ProgramData = strings.ReplaceAll(w.ProgramData, "SystemDrive", w.SystemDrive)
w.ProgramFiles = os.Getenv("ProgramFiles")
if w.ProgramFiles == "" {
pdKey, err := registry.OpenKey(registry.LOCAL_MACHINE,
`SOFTWARE\Microsoft\Windows\CurrentVersion`, registry.QUERY_VALUE)
if err == nil {
if pdVal, _, err := pdKey.GetStringValue("ProgramFilesDir"); err == nil {
w.ProgramFiles = pdVal
}
}
}
if w.ProgramFiles == "" {
w.loadErr = fmt.Errorf("cannot detect Windows ProgramFiles path")
return
}View on GitHub (pinned to 482b49bf1a)
Solutions
- Set the ProgramData environment variable (e.g. set ProgramData=C:\ProgramData) for the process/service account before starting the app.
- Verify the registry key HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders contains a ProgramData value and repair it if missing.
- Run the process as a normal Windows service account under a standard Windows installation so the default environment/registry are present.
- If running in a container/emulator, mount or provide a valid ProgramData path in the environment.
Example fix
// before (no env, registry lookup fails) w.ProgramData == "" -> cannot detect Windows ProgramData path // after (deployment/launch fix) # in service wrapper or container definition set ProgramData=C:\ProgramData
Defensive patterns
Strategy: validation
Validate before calling
if runtime.GOOS == "windows" && os.Getenv("ProgramData") == "" {
// probe or set before calling path helpers
return errors.New("ProgramData env var missing; set it before use")
} Try / catch
if err := winsvc.PathErr(); err != nil {
if strings.Contains(err.Error(), "cannot detect Windows ProgramData path") {
// fall back to a computed default or abort early
}
} Prevention
- Ensure the service account's environment includes standard Windows variables.
- Smoke-test path resolution on minimal Windows images before deploy.
- Log env at startup in debug mode to catch scrubbed environments.
When it happens
Trigger: Calling any path lookup (e.g. for service config/data paths) on Windows when the ProgramData environment variable is unset AND the registry lookup via getStringsValue on 'Shell Folders'/'ProgramData' fails or returns an empty string.
Common situations: Running inside a stripped-down service context or container where environment variables are scrubbed; running on non-Windows platforms compiled with windows tags; corrupted registry Shell Folders key; custom minimal Windows images.
Understand the failure class
Background: "environment variable is not set" and "Missing keys in environment" errors: what missing required env var messages mean and how to fix them — this error's family across 28 libraries.
Related errors
- cannot detect Windows ProgramFiles path
- cannot detect Windows SystemDrive path
- could not configure eventlog - %w
- could not remove eventlog configuration - %w
- eventlog.level must be one of INFO, WARN, or ERROR
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/8b9a09569d76662e.
Report an issue: GitHub.