diff options
author | Steven Murawski <steven.murawski@gmail.com> | 2016-05-24 16:27:51 -0500 |
---|---|---|
committer | Steven Murawski <steven.murawski@gmail.com> | 2016-05-24 16:27:51 -0500 |
commit | 4336bf146d624dadd6aeed3f03a11c08e7577c09 (patch) | |
tree | a628aaf75af802a4ff93cdb27696d53d40f35341 /lib | |
parent | 0eb51fcf05a40f093643ddfdbe5ce5a62376495a (diff) | |
download | mixlib-shellout-4336bf146d624dadd6aeed3f03a11c08e7577c09.tar.gz |
Keep `kill_process_tree` from killing protected system processes.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mixlib/shellout/windows.rb | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/lib/mixlib/shellout/windows.rb b/lib/mixlib/shellout/windows.rb index fd8039b..6957ea9 100644 --- a/lib/mixlib/shellout/windows.rb +++ b/lib/mixlib/shellout/windows.rb @@ -321,31 +321,43 @@ module Mixlib File.executable?(path) && !File.directory?(path) end + def self.system_required_processes + [ + 'System Idle Process', + 'System', + 'spoolsv.exe', + 'lsass.exe', + 'csrss.exe', + 'smss.exe', + 'svchost.exe' + ] + end + # recursively kills all child processes of given pid # calls itself querying for children child procs until # none remain. Important that a single WmiLite instance # is passed in since each creates its own WMI rpc process def self.kill_process_tree(pid, wmi, logger) wmi.query("select * from Win32_Process where ParentProcessID=#{pid}").each do |instance| + next if system_required_processes.include? instance.wmi_ole_object.name child_pid = instance.wmi_ole_object.processid kill_process_tree(child_pid, wmi, logger) - begin - logger.debug([ - "killing child process #{child_pid}::", - "#{instance.wmi_ole_object.Name} of parent #{pid}" - ].join) if logger - kill_process(instance) - rescue Errno::EIO, SystemCallError - logger.debug([ - "Failed to kill child process #{child_pid}::", - "#{instance.wmi_ole_object.Name} of parent #{pid}" - ].join) if logger - end + kill_process(instance, logger) end end - def self.kill_process(instance) + def self.kill_process(instance, logger) + child_pid = instance.wmi_ole_object.processid + logger.debug([ + "killing child process #{child_pid}::", + "#{instance.wmi_ole_object.Name} of parent #{pid}" + ].join) if logger Process.kill(:KILL, instance.wmi_ole_object.processid) + rescue Errno::EIO, SystemCallError + logger.debug([ + "Failed to kill child process #{child_pid}::", + "#{instance.wmi_ole_object.Name} of parent #{pid}" + ].join) if logger end def self.format_process(process, app_name, command_line, timeout) |