Hvordan kan jeg få listen over computernavne i Windows-netværk ved hjælp af Ruby

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ved, at Ruby har mange ædelstene, så programmerere skriver en rigtig smuk kode.
Dette korte eksempel som standard scanner alle adresser på subnet 192.168.1.x.


require 'ipscanner'
a = IPScanner.scan
#=> ["192.168.1.1", "192.168.1.4"]


Hvordan kan jeg få computernavne i stedet for ip? S? Er der nogen perle, der implementerer Window API (NetBIOS)?
Måske er det bedre at bruge smth. Som macaddr http://rubygems.org/gems/macaddr der analyserer 'ipconfig/all' (i mit tilfælde - 'nbtstat') [8]

Bedste reference


At ipscanner perle ser ud til at det bare cykler gennem 192.168.1. (1..254) og opbygger en række ip-adresser, der ikke tømmer denne linje: TCPSocket.new (ip\_address) [9] [10]]]


Så en metode kan være at vende omslaget til værtsnavnet med en IP-adresse. Det ser ud til, at Socket-klassen kan hjælpe dig. [11]


For eksempel:


Socket.do\_not\_reverse\_lookup = false
s = Socket.getaddrinfo(’66.249.67.49′,nil)
hostname = s[0][4]


eller


host = Resolv.new.getname('66.249.67.49')


Kode taget fra en blog. [12]


Jeg har ikke nogen computere på netværket for at teste dette, og jeg ved ikke nok om disse ting for at vide, om der er en forskel mellem en computers navn på en IP og værtsnavnet på en IP. Hvis ovenstående ikke virker, kan det ikke være for langt væk.

Andre referencer 1


Tak til @ danneu.


Jeg skrev simpelt eksempel, fungerer fint på Windows 7.
Tjek din firewall-politik (du kan bare få ip i stedet for computernavn)! Navn på computeren er den tredje parameter, så brug værtsnavn=Socket.getaddrinfo ('192.168.1.10', nul)

Andre referencer 2

Socket.do\_not\_reverse\_lookup = false
s = Socket.getaddrinfo(’66.249.67.49′,nil)
hostname = s[0][4]
.


require 'ipscanner'
Socket.do\_not\_reverse\_lookup = false
IPScanner.scan.each { 
    |i|
    puts "#{Socket.getaddrinfo(i, nil)}"    
}


Produktion:


[**"AF\_INET", 0, "STARBOY", 192.168.1.2, 2, 0, 0**]
[**"AF\_INET", 0, 192.168.1.1, 192.168.1.1, 2, 0, 0**]
[**"AF\_INET", 0, "mcx-PC", 192.168.1.4, 2, 0, 0**]


Dette eksempel er mere illustrativt, og det virker konsekvent at afslutte alle tråde. Pingecho timeout steg til 50 ms.


require 'ipscanner'

puts 'List of computers in your LAN. Please wait ...'

class IPScanner
    # override scan method
    def self.scan(ip\_base = '192.168.1.', range = 1..254, t = 50)
        computers = [] 
        threads = []  
        Socket.do\_not\_reverse\_lookup = false    
        (range).map { 
            |i| 
            threads << Thread.new {
                ip = ip\_base + i.to\_s
                if pingecho(ip, t) 
                    computers << Socket.getaddrinfo(ip, nil)[0][2]                    
                end
            }
        }.join      
        # wait for all threads to terminate
        threads.each { |thread| thread.join }
        return computers
    end
end

puts "#{IPScanner.scan}"


Produktion:


["STARBOY", "192.168.1.1", "mcx-PC"]