{"record":{"id":"84191848ab2ca806","repo":"puppetlabs/puppet","slug":"service-query-for-parameter-name-failed","errorCode":null,"errorMessage":"Service query for %{parameter_name} failed","messagePattern":"Service query for %(.+?) failed","errorType":"exception","errorClass":"Puppet::Util::Windows::Error","httpStatus":null,"severity":"error","filePath":"lib/puppet/util/windows/service.rb","lineNumber":523,"sourceCode":"          # to fail. Just ignore it\n          QueryServiceConfig2W(service, info_level, FFI::Pointer::NULL, 0, bytes_pointer)\n          size_required = bytes_pointer.read_dword\n          FFI::MemoryPointer.new(size_required) do |ssp_ptr|\n            # We need to supply the appropriate struct to be created based on\n            # the info_level\n            case info_level\n            when SERVICE_CONFIG_DELAYED_AUTO_START_INFO\n              config = SERVICE_DELAYED_AUTO_START_INFO.new(ssp_ptr)\n            end\n            success = QueryServiceConfig2W(\n              service,\n              info_level,\n              ssp_ptr,\n              size_required,\n              bytes_pointer\n            )\n            if success == FFI::WIN32_FALSE\n              raise Puppet::Util::Windows::Error, _(\"Service query for %{parameter_name} failed\") % { parameter_name: SERVICE_CONFIG_TYPES[info_level] }\n            end\n\n            yield config\n          end\n        end\n      end\n      private :query_config2\n\n      # @api private\n      # Sets an optional parameter on a service by calling\n      # ChangeServiceConfig2W\n      #\n      # @param [String] service_name name of service\n      # @param [Integer] change parameter to change\n      # @param [struct] value appropriate struct based on the parameter to change\n      def set_optional_parameter(service_name, change, value)\n        open_service(service_name, SC_MANAGER_CONNECT, SERVICE_CHANGE_CONFIG) do |service|\n          success = ChangeServiceConfig2W(","sourceCodeStart":505,"sourceCodeEnd":541,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/util/windows/service.rb#L505-L541","documentation":"Raised by Puppet::Util::Windows::Service#query_config2 when QueryServiceConfig2W returns FALSE while reading an optional per-service parameter. The only info level currently mapped is SERVICE_CONFIG_DELAYED_AUTO_START_INFO, and parameter_name is filled from SERVICE_CONFIG_TYPES, so the message names the parameter (e.g. 'SERVICE_CONFIG_DELAYED_AUTO_START_INFO'). Like other Puppet::Util::Windows::Error raises, it embeds the Win32 error from GetLastError.","triggerScenarios":"Reading or applying the 'delayed start' setting on a service (startup_config / set_startup_mode_delayed paths) when QueryServiceConfig2W fails: ERROR_ACCESS_DENIED on a locked-down service, ERROR_INVALID_HANDLE after the service was deleted, ERROR_INVALID_LEVEL on an OS/instance that does not support the delayed-auto-start level (e.g. kernel drivers or older Windows).","commonSituations":"Setting `enable => true, hasstatus => ...` manifests combined with delayed start on machines where the service binary is a kernel driver; a service uninstalled between the manifest compile and the transaction; running the agent without elevation against services that restrict SERVICE_QUERY_CONFIG.","solutions":["Confirm the service exists and is a win32 user-mode service, not a kernel driver (`sc qc <name>`).","Run Puppet elevated as Administrator so QueryServiceConfig2W is permitted.","Remove the delayed-start configuration for the resource if the OS/service type does not support it.","Re-run the agent to rule out a transient SCM state (service being deleted or reinstalled concurrently).","Check the wrapped Win32 code in the message to pinpoint which of the above applies."],"exampleFix":"# before\nPuppet::Util::Windows::Service.new_query_config_2? # internal helper reading delayed auto start\n\n# after - guard before using delayed start\nif svc.respond_to?(:delayed_auto_start?) # only meaningful for user-mode win32 services\n  Puppet::Util::Windows::Service.set_startup_mode_delayed(service_name, true)\nend","handlingStrategy":"try-catch","validationCode":"# only apply delayed-start to user-mode win32 services, not drivers\ninfo = `sc qcaption` # or parse `sc qc #{name}`\n# TYPE : 10  WIN32_OWN_PROCESS is safe; 1 KERNEL_DRIVER / 2 FILE_SYSTEM_DRIVER are not","typeGuard":null,"tryCatchPattern":"begin\n  Puppet::Util::Windows::Service.set_startup_mode_delayed(name, true)\nrescue Puppet::Util::Windows::Error => e\n  raise unless e.code == 5 || e.code == 1247 # ERROR_ACCESS_DENIED, ERROR_INVALID_LEVEL\n  Puppet.warning(\"delayed-start not supported/denied for #{name}; skipping\")\nend","preventionTips":["Do not declare delayed start for kernel drivers or services on OS versions lacking the delayed-auto-start level.","Run elevated when reading optional service parameters.","Keep delayed-start configuration out of manifests for services managed by installers that rewrite config concurrently."],"tags":["windows","win32","service","delayed-start","scm","puppet"],"backgroundTag":"windows-service-query-failed","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}