Nslookup per determinare hostname

di il
21 risposte

Nslookup per determinare hostname

Buongiorno a tutti.
non ho trovato un thread dove presentarmi, perciò lo faccio qui rubando pochissime righe.
mi chiamo andrea (cobi il mio nick) ho 57 anni; sto riprendendo a programmare dopo alcuni anni e ho bisogno di aiuto,
perchè dal vecchio vb6 al vb.net contenuto nel nuovo visual studio il salto (almeno per me) è enorme.

in questa fase di smart-working (ai miei tempi si chiamava 'telelavoro') mi sono accorto che i miei utenti spesso hanno
problemi di connessione in desktop remoto ai loro pc presenti (e sempre accesi) in ufficio. così ad una loro segnalazione
mi alzo, vado dallo loro postazione controllo il pc lo faccio ripartire se necessario dopodiché loro si connettono correttamente.

ho trovato diverse utilities che consentono il wake-on-lan, lo shutdown da un altro pc, ma la mia idea sarebbe quella di avere
un'applicazione che faccia lo scan della rete risolvendo con un ciclo for...next tutti gli ip in nomehost, salvarli in combobox
da cui poter selezionare il pc con il problema di accesso in DR e dalla mia applicazione farlo ripartire...
questa istruzione
Dim IPHost As IPHostEntry = GetHostEntry(ip.ToString())
funziona (l'ho ovviamente trovata su internet) ma è estremamente lenta e non fa al caso mio: per fare una scansione dei
canoni 255 indirizzi ip di una lan ci mette più di venti minuti.

esiste un metodo (perdonate fin da ora se utilizzo/utilizzerò termini in maniera impropria!) più intelligente?
qualcuno ha mai affrontato un progetto simile al mio?

grazie innanzitutto per ospitarmi fra le vostre pagine e dell'aiuto che vorrete darmi per aumentare le mie conoscenze
ed imparare a scrivere codice intelligente
andrea

21 Risposte

  • Re: Nslookup per determinare hostname

    Prima di continuare con il thread, perdonami, ma a che ti serve l'hostname se hai gli IP? Non ho capito ...

    P.S. Come ti colleghi tu ai PC? I PC come sono collegati tra loro? Esiste un DNS interno?
  • Re: Nslookup per determinare hostname

    Ciao oregon...

    nella mia applicazione determino il mio IP
    txtIP.Text = Net.Dns.GetHostEntry(SystemInformation.ComputerName).AddressList(0).ToString

    quindi prendo i primi tre ottetti del mio ip (ad esempio 10.0.10. )
    e in un ciclo for .. next creo l'ip completo a partire da .1 fino a .255

    ScanIP = tempScanIp
    For i = 1 To 255
    n = i
    ip = ScanIP & i.ToString

    Try
    Dim IPHost As IPHostEntry = GetHostEntry(ip.ToString())
    'popolo il combobox con il nome host intercettato
    ComboBox1.Items.Add(IPHost)
    Catch ex As Exception
    TextBox3.Text = "no client info" : TextBox3.Refresh()
    End Try
    Next i

    al termine del mio ciclo dovrei avere il combobox popolato con tutti gli hostname della mia rete
    che ovviamente non contiene 255 client - in questo modo avrò solo IP validi ovvero con una
    corrispondenza nella mia rete e utilizzando il nomehost supero il problema del DHCP che come sai
    non è detto sia sempre legato allo stesso hostname....

    spero di essermi spiegato in maniera comprensibile
    grazie
    andrea
  • Re: Nslookup per determinare hostname

    1) non avrai quello che termina con 255 non è un IP consentito

    2) è inutile testarli tutti, se l'ip non è assegnato o il pc spento, avrai dei ritardi dovuti al timeout per questi ip.
    Fai un ping con un timeout breve prima

    3) usa più thread per effettuare i test suddividendo il range di ip
  • Re: Nslookup per determinare hostname

    Ottimi consigli...
    quindi quel fastidioso ritardo è dovuto al problema dei timeout sugli ip non assegnati
    non a qualche mio errore meglio!!

    direi che al termine della scansione mi salvo la lista degli hostame trovati in un bel file txt o in una tabella access
    in modo da ripescarli subito al lancio dell'applicazione...

    adesso mi vado a cercare come utilizzare timeout brevi per il comando ping (cercherò anche quello ovviamente...)
    scusa forse li dovrei conoscere a memoria, ma sono proprio agli inizi.....
  • Re: Nslookup per determinare hostname

    Puoi provare così
    
    Public Class Form1
        Private Const ping_timeout_ms As Integer = 500
        Private test(254) As Boolean
        Private bg2_completed As Boolean = False
        Private bg3_completed As Boolean = False
        Private bg4_completed As Boolean = False
        Private my_net As String
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim ip() As Byte = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList(0).GetAddressBytes()
            my_net = ip(0).ToString & "." & ip(1).ToString & "." & ip(2).ToString & "."
            BackgroundWorker1.RunWorkerAsync()
            BackgroundWorker2.RunWorkerAsync()
            BackgroundWorker3.RunWorkerAsync()
            BackgroundWorker4.RunWorkerAsync()
        End Sub
    
        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            For i As Integer = 1 To 253 Step 4
                If My.Computer.Network.Ping(my_net & i.ToString, ping_timeout_ms) Then
                    test(i) = True
                Else
                    test(i) = False
                End If
            Next
        End Sub
    
        Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
            For i As Integer = 2 To 254 Step 4
                If My.Computer.Network.Ping(my_net & i.ToString, ping_timeout_ms) Then
                    test(i) = True
                Else
                    test(i) = False
                End If
            Next
            bg2_completed = True
        End Sub
    
        Private Sub BackgroundWorker3_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker3.DoWork
            For i As Integer = 3 To 251 Step 4
                If My.Computer.Network.Ping(my_net & i.ToString, ping_timeout_ms) Then
                    test(i) = True
                Else
                    test(i) = False
                End If
            Next
            bg3_completed = True
        End Sub
    
        Private Sub BackgroundWorker4_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker4.DoWork
            For i As Integer = 4 To 252 Step 4
                If My.Computer.Network.Ping(my_net & i.ToString, ping_timeout_ms) Then
                    test(i) = True
                Else
                    test(i) = False
                End If
            Next
            bg4_completed = True
        End Sub
    
        Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            While Not (bg2_completed And bg3_completed And bg4_completed)
                System.Threading.Thread.Sleep(100)
            End While
            For i As Integer = 1 To 254
                If test(i) Then
                    ComboBox1.Items.Add(my_net & i.ToString)
                Else
                    ComboBox2.Items.Add(my_net & i.ToString)
                End If
            Next
            MsgBox("Lista caricata!")
        End Sub
    End Class
    
  • Re: Nslookup per determinare hostname

    Ciao weierstrass
    wooowww !! grazie me lo studio subito il tuo codice e ti faccio sapere
  • Re: Nslookup per determinare hostname

    Le variabili BackgroundWorker1-2-3-4 non sono dichiarate
    le ho messe così:
    Public Property BackgroundWorker1 As Object
    Public Property BackgroundWorker2 As Object
    Public Property BackgroundWorker3 As Object
    Public Property BackgroundWorker4 As Object

    poi però ho un errore nella riga di dichiarazione delle quattro subroutines
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    --> la clausola Handles richiede una variabile WithEvents definita nel tipo che la contiene o in uno dei suoi tipi di base

    mi devi aiutare perchè non saprei proprio come metterci rimedio
    grazie e scusa
  • Re: Nslookup per determinare hostname

    Ho letto qualcosa sull'utilizzo di backgroundworker e sulla sua utilità
  • Re: Nslookup per determinare hostname

    Risolto errore sulla clausole WithEvents!!

    Private WithEvents BackgroundWorker1 As Object
    Private WithEvents BackgroundWorker2 As Object
    Private WithEvents BackgroundWorker3 As Object
    Private WithEvents BackgroundWorker4 As Object
  • Re: Nslookup per determinare hostname

    Però ho un errore ancora sull'evento .DoWork che non è stato trovato
  • Re: Nslookup per determinare hostname

    Aspetta.... trovato uno strumento background da mettere nel form...
    dai piano piano ci sto arrivando!!
  • Re: Nslookup per determinare hostname

    Non hai l'editor del form? Basta fare drag&drop dalla casella degli strumenti

    Se vuoi aggiungerli a mano:
    
        Private my_net As String
        Friend WithEvents BackgroundWorker1 As New System.ComponentModel.BackgroundWorker()
        Friend WithEvents BackgroundWorker2 As New System.ComponentModel.BackgroundWorker()
        Friend WithEvents BackgroundWorker3 As New System.ComponentModel.BackgroundWorker()
        Friend WithEvents BackgroundWorker4 As New System.ComponentModel.BackgroundWorker()
    
  • Re: Nslookup per determinare hostname

    Funziona tutto!!!
    grazie per l'aiuto

    ci metterò un bel pò a decifrare il tuo codice, non tanto a livello logico quanto a livello pratico e di
    conoscenza di tutte quelle istruzioni / metodi etc etc.....

    dove potrei trovare qualche manuale online o dove potrei studiare bene il linguaggio?
    grazie
  • Re: Nslookup per determinare hostname

    Ti consiglio di comprare in libreria una delle guide a Visual Studio (io avevo imparato il 2008, adesso non so cosa ci sia come libri)

    In un mesetto impari bene le cose di base. Una volta che sai quelle è facile: fai una ricerca ad hoc su google su quello che devi fare. I linguaggi .Net e Java hanno delle librerie sterminate che ti permettono di fare quasi tutto con poche righe di codice
Devi accedere o registrarti per scrivere nel forum
21 risposte