| # cim_process.rb |
| # enumerate/pull/release for CIM_Process |
| # |
| # |
| |
| require 'test/unit' |
| require 'rexml/document' |
| require File.join(File.dirname(__FILE__),'_loadpath') |
| require 'openwsman' |
| require File.join(File.dirname(__FILE__), '_client') |
| |
| class WsmanTest < Test::Unit::TestCase |
| def get_owner client, process |
| options = Openwsman::ClientOptions.new |
| # WMI just needs the Handle |
| unless process.name == "Win32_Service" |
| options.add_selector( "CSCreationClassName", process.CSCreationClassName ) |
| options.add_selector( "CSName", process.CSName ) |
| options.add_selector( "OSCreationClassName", process.OSCreationClassName ) |
| options.add_selector( "OSName", process.OSName ) |
| options.add_selector( "CreationClassName", process.CreationClassName ) |
| end |
| options.add_selector( "Handle", process.Handle ) |
| uri = process.ns |
| |
| method = "GetOwner" |
| result = client.invoke( options, uri, method ) |
| |
| end |
| |
| def test_client |
| client = Client.open |
| assert client |
| options = Openwsman::ClientOptions.new |
| assert options |
| options.flags = Openwsman::FLAG_ENUMERATION_OPTIMIZATION |
| options.max_elements = 999 |
| # options.set_dump_request |
| |
| # |
| # see http://msdn2.microsoft.com/en-us/library/aa386179.aspx for a list of CIM classes |
| # the Win32 classes are derived from |
| # |
| uri = "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_Process" |
| |
| result = client.enumerate( options, nil, uri ) |
| assert result |
| if result.fault? |
| fault = Openwsman::Fault.new result |
| puts "Enumerate returned fault" |
| puts "Fault code #{fault.code}, subcode #{fault.subcode}" |
| puts "\treason #{fault.reason}" |
| puts "\tdetail #{fault.detail}" |
| |
| exit 1 |
| end |
| |
| # puts "Result #{result.to_xml}" |
| results = 0 |
| faults = 0 |
| context = nil |
| |
| printf("%-20s %-10s %-10s %s\n", "User", "PID", "VSZ", "Command"); |
| puts "-------------------------------------------------------------" |
| |
| context = result.context |
| |
| result.body.EnumerateResponse.Items.each do |node| |
| |
| results += 1 |
| |
| # node = body.child( 0, Openwsman::NS_ENUMERATION, "PullResponse" ); |
| # node = node.child( 0, Openwsman::NS_ENUMERATION, "Items" ); |
| # node = node.child( 0, uri, "Win32_Service" ); |
| |
| # name = node.child( 0, uri, "Name" ).text; |
| # state = node.child( 0, uri, "State" ).text; |
| |
| if node.name == "Win32_Service" |
| caption = node["Caption"] |
| handle = node["Handle"] |
| virtual_size = node["VirtualSize"] |
| proc_id = node["ProcessId"] |
| cmd = node["ExecutablePath"] |
| else |
| caption = node["Caption"] |
| handle = node["Handle"] |
| virtual_size = 0 |
| proc_id = handle |
| cmd = node["Name"] |
| end |
| user = "" |
| |
| if node.name == "Win32_Service" |
| ires = get_owner client, node |
| if ires |
| b = ires.body |
| output = b.GetOwner_OUTPUT |
| output.each do |child| |
| text = child.text |
| if child.name == "User" |
| user = text |
| end |
| end if output |
| end |
| end |
| vsz = (virtual_size.to_s.to_i / (1024 * 1024 ) ).to_f |
| |
| printf("%-20s %-10s %-5.0f %s\n", user, proc_id, vsz, cmd); |
| |
| end |
| |
| client.release( options, uri, context ) if context |
| puts "Context released, #{results} results, #{faults} faults" |
| end |
| end |
| |