Newsgroup: it.comp.lang.visual-basic
Titolo: Rete Locale....

E' possibile ricavare tramite qualche chiamata API, tutti i nomi dei PC
collegati in rete locale???
Grazie Fulvio


Fulvio io ho il tuo stesso problema, se trovi una soluzione fammelo sapere
la mia mail č Al...@GalleriaDelCorso.it

 la mia mail č Al...@GalleriaDelCorso.it
asterix
falla tu la fatica, dai...
ci devono essere uno o piu' post di jimi, per me abbastanza incomprensibili,
al riguardo.
se poi magari (utinam, per i madrelingua) qualche *anima buona* volesse
anche commentarli e farci un vbp d'esempio, che so, pronto all'uso...
se non li trovi li cerco e te li mando.
if, pero' !

 possibilmente anche conoscere ogni indirizzo IP.
** To All **
Ditemi se questa secondo voi va bene per le FAQ (visto che
l'ho fatta apposta, un parere non guasterebbe).
Ti posto qui la versione aggiornata dell'esempio (che in effetti non
è più solo un "esempio", ma una routine completa).
Per quanto riguarda l'indirizzo IP delle macchine, vedi il post
"Indirizzo Ip" del 22/11 e anche  "Ping in VB5" del 29/11 (questo
per ulteriori informazioni, se ti va)
=========================================================
NOTE D'USO:
La funzione primaria è Net_ComputerNames(). Ritorna i nomi
delle macchine appartenenti a tutti i Domini raggiungibili dal
BrowseMaster, oppure, specificando un Dominio, tutte le macchine
che vi appartengono e le relative risorse.
Il prototipo è questo:
Public Function Net_ComputerNames( _
          strDomain As String, _
          ComputerList() As NET_COMPUTERS) As Long
strDomain  -> Nome del Dominio. Se la stringa non è nulla, la funzione
                       ritorna i nomi delle macchine e delle risorse condivise.
                       Se è nulla, ritorna il nome dei Domini raggiungibili e l'elenco
                       delle macchine che vi appartengono. Non ritorna l'elenco
                       delle risorse condivise. L'elenco delle risorse si può ottenere
                        con una successiva chiamata, specificando di quale Dominio
                        si richiede l'elenco.
ComputerList() -> Array (non inizializzato) di strutture (UDT) NET_COMPUTERS
                             che in uscita conterrà l'elenco delle risorse trovate.
                              I membri della struttura sono congegnati in modo tale che
                              risulti agevole l'inserimento dell'elenco in un oggetto a
                              visualizzazione gerarchica (Treeview, ad esempio).
                              La descrizione del significato dei membri è riportato nel codice.
La funzione restituisce il numero di elementi ComputerList().
La funzione viene chiamata in questo modo:
Dim strDomain as String
Dim ComputerList() As NET_COMPUTERS
Dim lngRet As Long
    strDomain = Ucase("MyDomain")
    'Oppure
    'strDomain = ""
    lngRet = Net_ComputerNames(strDomain, ComputerList())
    If lngRet > 0 Then
        'Processi
    End If
=========================================================
Option Explicit
'WNetEnumResources - WNetOpenEnum
Public Const RESOURCE_CONNECTED = &H1    'Risorse connesse
Public Const RESOURCE_GLOBALNET = &H2       'Tutte le risorse
Public Const RESOURCE_REMEMBERED = &H3      'Risorse permanenti
Public Const RESOURCETYPE_ANY = &H0         'Tutte le risorse
Public Const RESOURCETYPE_DISK = &H1        'Risorse di tipo "disk"
Public Const RESOURCETYPE_PRINT = &H2       'Risorse di tipo "printer"
Public Const RESOURCETYPE_UNKNOWN = &HFFFF  'Tipo di risorsa non noto
Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0
Public Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
Public Const RESOURCEDISPLAYTYPE_SERVER = &H2
Public Const RESOURCEDISPLAYTYPE_SHARE = &H3
Public Const RESOURCEDISPLAYTYPE_FILE = &H4
Public Const RESOURCEDISPLAYTYPE_GROUP = &H5
Public Const RESOURCEDISPLAYTYPE_NETWORK = &H6
Public Const RESOURCEDISPLAYTYPE_ROOT = &H7
Public Const RESOURCEDISPLAYTYPE_SHAREADMIN = &H8
Public Const RESOURCEDISPLAYTYPE_DIRECTORY = &H9
Public Const RESOURCEDISPLAYTYPE_TREE = &HA
Public Const RESOURCEDISPLAYTYPE_NDSCONTAINER = &HB
'Tutte le risorse
Public Const RESOURCEUSAGE_ALL = &H0
'Tutte le risorse che possono essere connesse
Public Const RESOURCEUSAGE_CONNECTABLE = &H1
'Tutti i container (Dominio, Host)
Public Const RESOURCEUSAGE_CONTAINER = &H2
'Altro tipo di risorsa (future extentions)
Public Const RESOURCEUSAGE_RESERVED = &H80000000
'Chiamata che ha avuto esito positivo
Public Const NO_ERROR = &H0
'WNetOpenEnum => dwScope o dwType sono parametri non validi
Public Const ERROR_INVALID_PARAMETER = &H57
'WNetEnumResources => Elencata l'ultima risorsa del container corrente
Public Const ERROR_NO_MORE_ITEMS = &H103
'WNetOpenEnum => Il parametro lpNetResource non è un container
Public Const ERROR_NOT_CONTAINER = &H4B7
'Errori realtivi alla rete => WNetGetLastError()
Public Const ERROR_EXTENDED_ERROR = &H4B8
'Nessuna rete presente
Public Const ERROR_NO_NETWORK = &H4C6
Public Type NETRESOURCE
   dwScope As Long
   dwType As Long
   dwDisplayType As Long
   dwUsage As Long
   lpLocalName As Long
   lpRemoteName As Long
   lpComment As Long
   lpProvider As Long
End Type
'Custom Type
Public Type NET_COMPUTERS
   Container As String
   Icon As Integer
   Level As Integer
   Parent As Integer
   Description As String
End Type
'NET_COMPUTERS - Membri
'.Container   -> Nome del Container. Dominio, Host o altra risorsa
'.Icon           -> Specifica come l'oggetto deve essere mostrato nel browsing
'                        Può assumere uno dei valori RESOURCEDISPLAYTYPE_*
'                        E' l'indice dell'icona da utilizzare nella visualizzazione
'.Level          -> Livello di visualizzazione. = 0 per i Domini
'.Parent         -> Nodo di riferimento. Se .Level = 0 => Root
'.Description  -> Descrizione relativa all'oggetto (impostazioni di rete)
Public Declare Function WNetOpenEnum Lib "mpr.dll" Alias _
       "WNetOpenEnumA" ( _
       ByVal dwScope As Long, _
       ByVal dwType As Long, _
       ByVal dwUsage As Long, _
       lpNetResource As Any, _
       lphEnum As Long) As Long
Public Declare Function WNetEnumResource Lib "mpr.dll" Alias _
      "WNetEnumResourceA" ( _
      ByVal hEnum As Long, _
      lpcCount As Long, _
      ByVal lpBuffer As Long, _
      lpBufferSize As Long) As Long
Public Declare Function WNetCloseEnum Lib "mpr.dll" ( _
      ByVal hEnum As Long) As Long
Public Declare Function WNetGetLastError Lib "mapr.dll" ( _
      ByVal lpError As Long, _
      ByVal lpErrorBuf As String, _
      ByVal nErrorBufSize As Long, _
      ByVal lpNameBuf As String, _
      ByVal nNameBufSize As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
      hpvDest As Any, _
      ByVal hpvSource As Any, _
      ByVal cbCopy As Long)
Private Declare Function lstrcpy Lib "kernel32" Alias _
      "lstrcpyA" ( _
      ByVal lpszDest As String, _
      ByVal lpszSource As Long) As Long
'-----------------------------------------------------------------------
Public Function Net_ComputerNames( _
          strDomain As String, _
          ComputerList() As NET_COMPUTERS) As Long
Dim hEnum As Long
'Elenco dei Container di primo livello (Domini)
Dim lpContainers(9) As NETRESOURCE
'Elenco dei Container di secondo livello (Host)
Dim lpResources(499) As NETRESOURCE
'Buffer di transito
Dim NETR As NETRESOURCE
'Dimensione del buffer per NETRESOURCE
Dim cbBuff As Long
'Numero di Container di primo livello (Domini)
Dim cCount As Long
'Numero di Container di secondo livello (Host)
Dim rCount As Long
Dim cCounter As Long
Dim rCounter As Long
Dim lngResources As Long
Dim strDomainBuff As String * 16
Dim lngRet As Long
   On Error Resume Next
   lngResources = -1
   'Puntatore al nome di Dominio (Container) specificato
   'La prima chiamata a WNetOpenEnum() recupera i nomi
   'di tutti i Container validi per il provider di rete
   If strDomain = "" Then
      NETR.lpRemoteName = 0
   Else
      strDomainBuff = strDomain & Chr$(0)
      strDomainBuff = StrConv(strDomainBuff, vbFromUnicode)
      NETR.lpLocalName = StringToPointer(StrPtr(strDomainBuff))
      'NETR.lpRemoteName = StringToPointer(StrPtr(strDomainBuff))
   End If
   'Buffer per i Container di primo livello
   cbBuff = Len(NETR) * 10
   'Tutte le risorse disponibili del Container corrente
   cCount = &HFFFFFFFF
   'Ottiene l'Enumeration Handle
   DoEvents
   lngRet = WNetOpenEnum( _
         RESOURCE_GLOBALNET, _
         RESOURCETYPE_ANY, _
         RESOURCEUSAGE_ALL, _
         NETR, _
         hEnum)
   If lngRet = NO_ERROR Then
      'Prima chiamata: elenco dei Container di primo livello
      lngRet = WNetEnumResource( _
                    hEnum, _
                    cCount, _
                    VarPtr(lpContainers(0)), _
                    cbBuff)
      If lngRet = NO_ERROR Then
         For cCounter = 0 To cCount - 1
            'Copia la struttura nel buffer per la chiamata successiva
            'a WNetOpenEnum() -> l'elenco dei Container di secondo livello
            CopyMemory NETR, VarPtr(lpContainers(cCounter)), Len(NETR)
            lngResources = lngResources + 1
            ReDim Preserve ComputerList(lngResources)
            'Aggiorna l'elenco delle risorse
            With ComputerList(lngResources)
               .Container = PointerToString(NETR.lpRemoteName)
               .Container = Mid$(.Container, InStrRev(.Container, "\") + 1)
               .Container = StrConv(.Container, vbProperCase)
               .Icon = NETR.dwDisplayType
               .Description = PointerToString(NETR.lpComment)
               .Parent = cCounter
               .Level = 0
            End With
            cbBuff = Len(NETR) * 500
            rCount = &HFFFFFFFF
            DoEvents
            lngRet = WNetOpenEnum(RESOURCE_GLOBALNET, _
                          RESOURCETYPE_ANY, _
                           0&, _
                           NETR, _
                           hEnum)
            If lngRet = NO_ERROR Then
               Do
                  'Call the enumeration function.
                  lngRet = WNetEnumResource(hEnum, _
                                rCount, _
                                VarPtr(lpResources(0)), _
                                cbBuff)
                  If lngRet <> ERROR_NO_MORE_ITEMS Then
                     For rCounter = 0 To rCount - 1
                        CopyMemory NETR, VarPtr(lpResources(rCounter)), Len(NETR)
                        lngResources = lngResources + 1
                        ReDim Preserve ComputerList(lngResources)
                        'Aggiorna l'elenco delle risorse
                        With ComputerList(lngResources)
                           .Container = PointerToString(NETR.lpRemoteName)
                           .Container = Mid$(.Container, InStrRev(.Container, "\") + 1)
                           .Container = StrConv(.Container, vbProperCase)
                           .Icon = NETR.dwDisplayType
                           .Description = PointerToString(NETR.lpComment)
                           .Parent = cCounter
                           .Level = 1
                        End With
                     Next rCounter
                  End If
               Loop While lngRet <> ERROR_NO_MORE_ITEMS
            Else
               Call Net_ErrorHandler(lngRet)
               Exit Function
            End If
         Next cCounter
      Else
         Call Net_ErrorHandler(lngRet)
      End If
   Else
      Call Net_ErrorHandler(lngRet)
   End If
   WNetCloseEnum (hEnum)
   Net_ComputerNames = lngResources
End Function
'-----------------------------------------------------------------------
Private Sub Net_ErrorHandler(lngErrorCode As Long)
'
'Funzione che imposta un messaggio di avviso
'e relativa descrizione dell'errori di rete
Dim strMessage As String
   Select Case lngErrorCode
   Case ERROR_NO_NETWORK
      strMessage = "La rete non è installata!"
   Case ERROR_EXTENDED_ERROR
      strMessage = "Impossibile sfogliare la rete :(" & vbCrLf & _
                            "Il sistema riporta: " & vbCrLf
      strMessage = strMessage & Net_GetLastError()
   Case ERROR_NOT_CONTAINER
      strMessage = "Il Container specificato non è un Container valido."
   Case ERROR_INVALID_PARAMETER
      strMessage = "E' stato specificato un parametro non valido."
   Case Else
      strMessage = "Si è verificato un errore imprevisto." & vbCrLf & _
                            "Impossibile accedere alle risorse di rete."
   End Select
   MsgBox strMessage, vbCritical, "Errore"
End Sub
'-----------------------------------------------------------------------
Private Function Net_GetLastError() As String
'
'Se si verifica un errore ERROR_EXTENDED_ERROR
'la funzione WNetGetLastError() riporta la descrizione
'dell'errore e il nome del provider di rete cha l'ha generato
Dim strError As String
Dim strErrorProvider As String
Dim lngError As Long
Dim lngRet As Long
   strError = Space(255, 0)
   strErrorProvider = Space(255, 0)
   lnret = WNetGetLastError(lngError, strError, 255, strErrorProvider, 255)
   strErrorProvider = Left$(strErrorProvider, InStr(strErrorProvider, Chr$(0)))
   strError = Left$(strError, InStr(strError, Chr$(0)))
   If Len(strErrorProvider) > 0 Then
      strError = "Provider: " & strErrorProvider & ". " & strError
   End If
   Net_GetLastError = strError
End Function
'-----------------------------------------------------------------------
Private Function PointerToString(lngPointer As Long) As String
'Restituisce la stringa di [lngPointer] cui è il puntatore
Dim strBuff As String
   If lngPointer = 0 Then
      PointerToString = ""
      Exit Function
   End If
   strBuff = String(255, 0)
   lstrcpy strBuff, lngPointer
   PointerToString = Left$(strBuff, InStr(strBuff, Chr$(0)) - 1)
End Function
'-----------------------------------------------------------------------
Public Function StringToPointer(lngPointer As Long) As Long
'
'Funzione helper. Visto che non è sempre possibile assegnare
'ad una variabile il valore reso da StrPtr, la funzione
'restituisce semplicemente il valore Long del Puntatore
   StringToPointer = lngPointer
End Function

 ciao, hal
perche' schermirsi ?
il piu' l'hai fatto (piu' o meno...)
fai anche un bel vbp d'esempio, cosi' tutti te ne saremo grati :))
ciao, a.


Ciaotutti,
Asterix

Prova con quanto segue:
1)Crea un nuovo Modulo di Classe
Option Explicit
Private Type RisorseDiRete
   dwScope As Long
   dwType As Long
   dwDisplayType As Long
   dwUsage As Long
   lpLocalName As Long
   lpRemoteName As Long
   lpComment As Long
   lpProvider As Long
End Type
Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias _
  "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long, _
  ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias _
  "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, _
  ByVal lpBuffer As Long, lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" _
   (ByVal hEnum As Long) As Long
Private Const RESOURCE_CONNECTED = &H1
Private Const RESOURCE_GLOBALNET = &H2
Private Const RESOURCE_REMEMBERED = &H3
Private Const RESOURCETYPE_ANY = &H0
Private Const RESOURCETYPE_DISK = &H1
Private Const RESOURCETYPE_PRINT = &H2
Private Const RESOURCETYPE_UNKNOWN = &HFFFF
Private Const RESOURCEUSAGE_CONNECTABLE = &H1
Private Const RESOURCEUSAGE_CONTAINER = &H2
Private Const RESOURCEUSAGE_RESERVED = &H80000000
Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
Private Declare Function GlobalAlloc Lib "KERNEL32" _
  (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "KERNEL32" _
  (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias _
  "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, _
   ByVal cbCopy As Long)
Private Declare Function CopyPointer2String Lib _
  "KERNEL32" Alias "lstrcpyA" (ByVal NewString As _
  String, ByVal OldString As Long) As Long
Public Sub VisualizzaUtenti(ByRef Controllo As Object)
Dim hEnum As Long, lpBuff As Long, Network As RisorseDiRete
Dim cbBuff As Long, cCount As Long
Dim p As Long, res As Long, i As Long
On Error Resume Next
Controllo.AddItem " "
Controllo.Clear
If Err.Number > 0 Then Exit Sub
On Error GoTo ErrorHandler
Network.lpRemoteName = 0
cbBuff = 10000
cCount = &HFFFFFFFF
res = WNetOpenEnum(RESOURCE_GLOBALNET, _
  RESOURCETYPE_ANY, 0, Network, hEnum)
If res = 0 Then
   lpBuff = GlobalAlloc(GPTR, cbBuff)
   res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
   If res = 0 Then
      p = lpBuff
      For i = 1 To cCount
         CopyMemory Network, ByVal p, LenB(Network)
         Controllo.AddItem "Utenti in Rete : " & _
            PointerToString(Network.lpRemoteName)
         RisorseRete Network, Controllo
         p = p + LenB(Network)
      Next i
      End If
ErrorHandler:
On Error Resume Next
   If lpBuff <> 0 Then GlobalFree (lpBuff)
   WNetCloseEnum (hEnum)
   Controllo.AddItem "Nessun Utente Collegato", 9
End If
End Sub
Private Function PointerToString(p As Long) As String
   Dim s As String
   s = String(255, Chr$(0))
   CopyPointer2String s, p
   PointerToString = Left(s, InStr(s, Chr$(0)) - 1)
End Function
Private Sub RisorseRete(Network As RisorseDiRete, Controllo As Object)
   Dim hEnum As Long, lpBuff As Long
   Dim cbBuff As Long, cCount As Long
   Dim p As Long, res As Long, i As Long
   cbBuff = 10000
   cCount = &HFFFFFFFF
   res = WNetOpenEnum(RESOURCE_GLOBALNET, _
     RESOURCETYPE_ANY, 0, Network, hEnum)
   If res = 0 Then
      lpBuff = GlobalAlloc(GPTR, cbBuff)
      res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
      If res = 0 Then
         p = lpBuff
         For i = 1 To cCount
            CopyMemory Network, ByVal p, LenB(Network)
            Controllo.AddItem "Computer in Rete : #" & i & " " &
PointerToString(Network.lpRemoteName)
            p = p + LenB(Network)
         Next i
      End If
      If lpBuff <> 0 Then GlobalFree (lpBuff)
      WNetCloseEnum (hEnum)
   End If
End Sub
by Utente Win2k