Ottenere il nome del server

di il
11 risposte

Ottenere il nome del server

Buongiorno.

In una piccola rete locale alcuni PC possono richiamare un eseguibile che risiede su uno di essi, il quale quindi funge anche da server per gli altri.

Conoscendo il path assoluto per raggiungere detto eseguibile, avrei bisogno di acquisire il nome (ed eventualmente altre proprietà) del server.

Variante: a fungere da server potrebbe essere un NAS anziché uno dei PC.

Esiste un modo, possibilmente non troppo complicato?

Grazie.

11 Risposte

  • Re: Ottenere il nome del server

    Se puoi risolvere il nome lo ottieni con il dns.

    Per le proprietà è più difficile per una questione di autorizzazioni ma dipende da cosa.

  • Re: Ottenere il nome del server

    Non mi è chiaro. Il metodo Dns.Resolve richiede di conoscere l'indirizzo ip per ottenere il nome o viceversa, ma io non ho l'indirizzo ip del server, ho solo il path per raggiungere il mio eseguibile nella forma X:\myprogr.exe , dove X è l'unità mappata sulla directory condivisa del server.

  • Re: Ottenere il nome del server

    Se scrivi NET USE cosa ottieni?

    Dovresti usare la API WNetEnumResource (ci sono esempi vari su internet)

  • Re: Ottenere il nome del server

    Ottengo l'elenco delle condivisioni, così:

    Stato       Locale     Remota                    Rete

    -------------------------------------------------------------------------------
    OK           Q:        \\Nas4d2b9a\afs           Microsoft Windows Network
    Esecuzione comando riuscita.

    Quindi, se riesco ad intercettare  l'output di una shell che esegue net use, dovrei poter ricavare quel “Nas4d2b9a” che è ciò che mi interessa.

  • Re: Ottenere il nome del server

    Sì, si può fare. Occorre però eseguire la shell in un processo separato.

    Grazie Antonio.

            Dim oProcess As New Process()
            Dim oStartInfo As New ProcessStartInfo("NET", "USE")
            oStartInfo.UseShellExecute = False
            oStartInfo.RedirectStandardOutput = True
            oProcess.StartInfo = oStartInfo
            oProcess.Start()
    
            Dim sOutput As String
            Using oStreamReader As System.IO.StreamReader = oProcess.StandardOutput
                sOutput = oStreamReader.ReadToEnd()
            End Using
            'Label2.Text = sOutput
    
            Dim sShare As String = Application.StartupPath.Substring(0, 2)
            Dim i1 As Integer = sOutput.IndexOf(sShare)
            If i1 > 0 Then
                i1 = sOutput.IndexOf("\\", i1)
                Dim i2 As Integer = sOutput.IndexOf("\", i1 + 2)
                Dim sServerName As String = sOutput.Substring(i1 + 2, i2 - i1 - 2)
                Label3.Text = sServerName
            End If
    
  • Re: Ottenere il nome del server

    Di nulla Andrea, a risentirci

  • Re: Ottenere il nome del server

    C'è uno strascico.

    Su qualche PC l'output del comando NET USE non contiene il nome del server, bensì il suo indirizzo IP:

    Stato       Locale     Remota                    Rete

    -------------------------------------------------------------------------------
    OK           Q:        \\192.168.1.240\afs       Microsoft Windows Network
    Esecuzione comando riuscita.

    Da prove fatte pare che non dipenda dalla versione di Windows.

    Per fortuna è facile risalire al nome del server con il metodo Dns.GetHostEntry:

          If Regex.IsMatch(sServerName, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") Then
              Dim host As IPHostEntry = Dns.GetHostEntry(sServerName)
              Label4.Text = host.HostName.Replace(".local", "")				'elimina la parte inutile
          End If

    Buone feste a tutto il forum!

  • Re: Ottenere il nome del server

    Certo, è possibile, dipende da come viene mappata la risorsa (con nome o con IP). E' del tutto equivalente e per questo inizialmente ti parlavo di risoluzione DNS (fatta appunto dalla GetHostEntry).

    Se la mappatura viene fatta direttamente con il nome allora non ci sono problemi.

  • Re: Ottenere il nome del server

    Ah OK, ora è chiaro. Grazie ancora.

  • Re: Ottenere il nome del server

    Per completare, non è detto che un server/nas siano registrato nel DNS e quindi raggiungibile con un nome, ma sicuramente deve avere un IP.

    Quando lo mappi sul tuo client (manualmente o automaticamente tramite uno script di login) puoi scrivere

    NET USE X: \\<ip>\condivisione   /USER:utente   password

    oppure

    NET USE X: \\nomeserver\condivisione   /USER:utente   password

    se il server è registrato sul DNS (o è ottenibile con altro sistema di risoluzione nomi)

  • Re: Ottenere il nome del server

    Chiaro.

    Comunque alla fine ho optato per un metodo diverso (System.Management) rispetto a ricavare il nome dall'output di NET USE, che mi sembrava un po' … rozzo.

    Riporto il codice completo, che funziona sia con mappatura su nome che su IP e anche per drive locali.

       Private Function GetServerName() As String
           Dim filePath As String = Application.StartupPath
           Dim serverName As String = ""
           
           'Non mappato
           If filePath.StartsWith("\\") Then
               serverName = filePath.Substring(2, filePath.IndexOf("\", 2) - 2)
               serverName = IpAddressToName(serverName)
               Return serverName
           End If
           
           'Mappato
           Dim driveLetter As String = IO.Path.GetPathRoot(filePath).Replace("\", "")
           Dim query As New ObjectQuery("select * from Win32_LogicalDisk")
           
           Using searcher As New ManagementObjectSearcher(query)
               For Each mo As ManagementObject In searcher.Get()
                   If driveLetter = mo("Caption").ToString Then
                       If mo("DriveType").ToString = "4" Then          'disco di rete
                           serverName = mo("ProviderName").ToString
                           serverName = serverName.Replace("\\", "")
                           serverName = serverName.Substring(0, serverName.IndexOf("\"))
                       Else
                           serverName = Dns.GetHostName                'disco locale
                       End If
                       Exit For
                   End If
               Next
           End Using
           
           serverName = IpAddressToName(serverName)
           Return serverName
       End Function
       
       Private Function IpAddressToName(ipAddress As String) As String
           If Regex.IsMatch(ipAddress, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") Then
               Dim host As IPHostEntry = Dns.GetHostEntry(ipAddress)
               Return host.HostName.Replace(".local", "")
           Else
               Return ipAddress
           End If
       End Function
    

    Ciao e grazie ancora.

Devi accedere o registrarti per scrivere nel forum
11 risposte