{"record":{"id":"e4789c61c1e20c5f","repo":"puppetlabs/puppet","slug":"service-query-failed","errorCode":null,"errorMessage":"Service query failed","messagePattern":"Service query failed","errorType":"exception","errorClass":"Puppet::Util::Windows::Error","httpStatus":null,"severity":"error","filePath":"lib/puppet/util/windows/service.rb","lineNumber":442,"sourceCode":"          QueryServiceStatusEx(\n            service,\n            :SC_STATUS_PROCESS_INFO,\n            FFI::Pointer::NULL,\n            0,\n            bytes_pointer\n          )\n          size_required = bytes_pointer.read_dword\n          FFI::MemoryPointer.new(size_required) do |ssp_ptr|\n            status = SERVICE_STATUS_PROCESS.new(ssp_ptr)\n            success = QueryServiceStatusEx(\n              service,\n              :SC_STATUS_PROCESS_INFO,\n              ssp_ptr,\n              size_required,\n              bytes_pointer\n            )\n            if success == FFI::WIN32_FALSE\n              raise Puppet::Util::Windows::Error, _(\"Service query failed\")\n            end\n\n            yield status\n          end\n        end\n      end\n      private :query_status\n\n      # @api private\n      # perform QueryServiceConfigW on a windows service and return the\n      # result\n      #\n      # @param [:handle] service handle of the service to query\n      # @return [QUERY_SERVICE_CONFIGW struct] the result of the query\n      def query_config(service, &block)\n        config = nil\n        size_required = nil\n        # Fetch the bytes of memory required to be allocated","sourceCodeStart":424,"sourceCodeEnd":460,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/util/windows/service.rb#L424-L460","documentation":"Raised by the private query_status helper when QueryServiceStatusEx returns FALSE after a first sizing call succeeded. The handle must have been opened with SERVICE_QUERY_STATUS. Typical Win32 causes: the handle is stale or was closed, access is denied, or the service is marked for deletion so the SCM refuses further queries. It propagates out of service_state, start/stop transitions, and exists? checks.","triggerScenarios":"Querying status on a service deleted while a handle was open (ERROR_SERVICE_MARKED_FOR_DELETE, 1072); a handle opened without SERVICE_QUERY_STATUS; SCM/RPC failures mid-query; races where the service is uninstalled between open_service and the query.","commonSituations":"Uninstall/reinstall churn during the run (MSI removing the service under Puppet); monitoring code holding handles across service deletion; least-privileged tokens lacking query rights.","solutions":["Check e.code: 1072 = marked for delete, 5 = access denied, 1060 = service gone","Re-open the service and retry once when the error follows an uninstall/reinstall","Ensure the code requests SERVICE_QUERY_STATUS (Puppet's helpers already do) and the token allows it","If 1072 keeps firing, reboot or clear the deletion by closing other handles (sc stop on lingering processes)"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"begin\n  Puppet::Util::Windows::Service.service_state(name)\nrescue Puppet::Util::Windows::Error => e\n  if e.code == 1072 # ERROR_SERVICE_MARKED_FOR_DELETE\n    raise Puppet::Error, \"#{name} is marked for deletion; close handles or reboot\"\n  end\n  raise\nend","preventionTips":["Re-open and retry once after uninstall/reinstall churn","Do not hold service handles across deletion; close them promptly","Branch on e.code: 1072 marked-for-delete, 5 access denied, 1060 service gone"],"tags":["windows","service","win32","scm","query","marked-for-delete"],"backgroundTag":"windows-service-query-failed","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}