summaryrefslogtreecommitdiff
path: root/lib/mixlib/shellout/windows.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mixlib/shellout/windows.rb')
-rw-r--r--lib/mixlib/shellout/windows.rb38
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)