Newsgroup: it.comp.lang.visual-basic
Titolo: Elenco computer in un dominio

Salve a tutti.
Ho bisogno di poter individuare tutte le macchine di un dominio NT,
possibilmente anche conoscere ogni indirizzo IP.
Qualcuno puņ aiutarmi???
Grazie mille.
Ciao

 possibilmente anche conoscere ogni indirizzo IP.
mi sembra che jimi l'abbia postato almeno un paio di volte negli ultimi 3
mesi. se puoi prova a cercare i suoi post, eventualmente in 
www.deja.com
.
ciao, a.

 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

l'ho fatta apposta, un parere non guasterebbe).
Visto che sarebbe una FAqquona, che ne dici, piuttosto, di fare un cut&paste in un progettino
d'esempio da inviare al SC?
Probabilmente risulterebbe di più semplice ed immediata lettura...
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

 l'ho fatta apposta, un parere non guasterebbe).
ammettendo che non l'ho ancora provata, solo scorsa, debbo, mio malgrado, e
con ingiustificabile ritardo, sottoscrivere quel certo post in cui si
suggeriva di alleggerirti di quella parte (due, per la precisione) -- che
hai peraltro definito poi, con rammarico, "not available" -- e metterla in
bacheca. che altro dire ?
ah, si', questo:
se incontri hal o pal
guardati le spall
e non solo quell :)))

grazie, a.
Anche secondo me!
Penso che le FAQ in generale dovrebbero essere brevi, concise e
soprattutto pratiche ... questa non e' ne' breve ne' concisa, ma +
pratica di cosi' non si scappa .. poi c'e' da dire che non si potrebbe
riassumere .. quindi appoggio Jimi e pal ... mi piace!!!
Ciaps
Stracca
http://www.stracca.net
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------


Pollice su. Appoggio anch' io.
Ciao
Aldo
(Ma chi c' e' sotto a reggere tutto ?)

 Probabilmente risulterebbe di più semplice ed immediata lettura...
Il progettino è già pronto.
Questo post è il *copy*&paste del progetto.
Quello che mi interessava sapere è se una procedura, messa così,
secondo voi è adatta ad essere utilizzata come risposta ad una FAQ.
Forse è, come dici tu, la lettura non è certo agevolata.
Chiedevo dei suggerimenti su come affrontare certi argomenti.
Ad una domanda di questo tipo non si può rispondere in due
righe (neppure 10) e non so se è il caso di rimandare semplicemente
ad un progetto presente sul SC, lasciando solo le spiegazioni.
Come dicevo ieri a Pal, voglio porre al NG alcune questioni
relative a ciò che si aspettano da una FAQ.
Questa è una di quelle questioni.

 e non solo quell :)))
Di Oscar Wilde, in vostro onore (contemporanei, credo) ? :)))
Si cominciano a notare gli effetti della scarsità di partecipazione
femminile a questo NG.

 ha scritto
moreno:


che si potesse fare c+p l'avevo sospettato :)
