77 lines
2.2 KiB
Ruby
77 lines
2.2 KiB
Ruby
# wql.rb
|
|
# WS-Man Query Language (for WINRM)
|
|
#
|
|
# http://msdn.microsoft.com/en-us/library/aa394606(VS.85).aspx
|
|
|
|
require 'test/unit'
|
|
require 'rexml/document'
|
|
require File.join(File.dirname(__FILE__),'_loadpath')
|
|
require 'openwsman'
|
|
require File.join(File.dirname(__FILE__), '_client')
|
|
|
|
def handle_fault client, result
|
|
unless result
|
|
if client.last_error != 0
|
|
STDERR.puts "Client connection to #{client.scheme}://#{client.user}:#{client.password}@#{client.host}:#{client.port}/#{client.path} failed with #{client.last_error}, Fault: #{client.fault_string}"
|
|
exit 1
|
|
end
|
|
if client.response_code != 200
|
|
STDERR.puts "Client requested result #{client.response_code}, Fault: #{client.fault_string}"
|
|
exit 1
|
|
end
|
|
STDERR.puts "Client action failed for unknown reason"
|
|
exit 1
|
|
end
|
|
if result.fault?
|
|
fault = Openwsman::Fault.new result
|
|
STDERR.puts "Fault code #{fault.code}, subcode #{fault.subcode}"
|
|
STDERR.puts "\treason #{fault.reason}"
|
|
STDERR.puts "\tdetail #{fault.detail}"
|
|
exit 1
|
|
end
|
|
end
|
|
|
|
class WsmanTest < Test::Unit::TestCase
|
|
|
|
def test_wql
|
|
client = Client.open
|
|
options = Openwsman::ClientOptions.new
|
|
options.flags = Openwsman::FLAG_ENUMERATION_OPTIMIZATION
|
|
options.max_elements = 999
|
|
# options.set_dump_request
|
|
|
|
namespace = "root/cimv2"
|
|
classname = "*" # must be '*' for WQL
|
|
uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/#{namespace}/#{classname}"
|
|
|
|
filter = Openwsman::Filter.new
|
|
# see winenum.rb for more examples
|
|
filter.wql "select * from Win32_NetworkAdapterConfiguration where IPEnabled=true"
|
|
|
|
result = client.enumerate( options, filter, uri )
|
|
handle_fault client, result
|
|
assert result
|
|
if result.fault?
|
|
puts "Enumerate returned fault"
|
|
puts "\t #{client.last_error}:#{client.fault_string}"
|
|
exit 1
|
|
end
|
|
|
|
# puts "Result #{result.to_xml}"
|
|
results = 0
|
|
faults = 0
|
|
|
|
loop do
|
|
result.Items.each do |node|
|
|
results += 1
|
|
puts "#{node.name}: IPEnabled: #{node.IPEnabled}"
|
|
end
|
|
context = result.context
|
|
break unless context
|
|
result = client.pull( options, nil, uri, context )
|
|
break unless result
|
|
end
|
|
puts "#{results} results, #{faults} faults"
|
|
end
|
|
end
|