Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

VB: Liste der Freigaben in LAN

Anonym / 5 Antworten / Baumansicht Nickles

Hallo!

Ich nutze Visual Basic 6.
Ich suche nach einem Weg, eine Liste aller freigegebenen Ordner eines PCs in einem LAN anzuzeigen. Sprich:
Ich habe z.B. rechts eine ListBox mit Computernamen und wenn ich einen auswähle wird mir rechts in einer Directory-Box seine Freigabe angezeigt.
Wie wird das gemacht?

Links zu diesem Thema wären auch toll.

Danke im Voraus.

PCO

bei Antwort benachrichtigen
T-Rex Anonym „VB: Liste der Freigaben in LAN“
Optionen

Hallo,


ein etwas längerer Code.
Der Computername muß beide führenden BackSlashs haben, damit die Freigaben ausgelesen werden.
Und ein paar Constanten, die ich benutze:

'   Die Netzwerk-Resource im Klartext
Private Type NETRESOURCE
   dwScope As Long
   dwType As Long
   dwDisplayType As Long
   dwUsage As Long
   lpLocalName As String
   lpRemoteName As String
   lpComment As String
   lpProvider As String
End Type

'   Die Netzwerk-Resource, wie die API sie braucht
Private Type NETRESOURCE_P
   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 Const RESOURCE_GLOBALNET = &H2
Private Const RESOURCE_CONNECTED = &H1
Private Const RESOURCE_PRIVATENET = &H2
Private Const RESOURCE_REMEMBERED = &H3
Private Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
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 ERROR_NO_MORE_ITEMS = 259

Private Declare Function lstrcpy Lib "kernel32" ( _
   ByVal DestinationStr As String, _
   ByVal SourcePtr As Long _
) As Long

Private Declare Function lstrlen Lib "kernel32" ( _
   ByVal SourcePtr As Long _
) As Long

Private Declare Function WNetCloseEnum Lib "mpr.dll" ( _
   ByVal EnumHandle As Long _
) As Long

Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" ( _
   ByVal EnumHandle As Long, _
   lpcCount As Long, _
   lpBuffer As Any, _
   lpBufferSize As Long _
) As Long

Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" ( _
   ByVal dwScope As Long, _
   ByVal dwType As Long, _
   ByVal dwUsage As Long, _
   lpNetResource As NETRESOURCE, _
   EnumHandle As Long _
) As Long

Public Sub Lese_Freigaben(txtComputer As String)
   '   Speicher reservieren
   Dim Count As Long
   Dim EnumHandle As Long
   Dim NullString As NETRESOURCE
   Dim ReturnValue As Long
   Dim SizeTestR As Long
   Dim StringPtr As String
   Dim TestR(4096) As NETRESOURCE_P
   Dim Zaehler As Long
   Dim MicrosoftRoot As NETRESOURCE
   Dim MachineContainer As NETRESOURCE
   Dim NetResult As Integer
   Dim hEnum As Long
   Dim i As Long
   Dim cbCount As Long
   Dim lString As String
   Dim ParentNodeName As String

   '   Root-Struktur definieren
   NullString.dwDisplayType = 0
   NullString.dwScope = 0
   NullString.dwType = 0
   NullString.dwUsage = 0
   NullString.lpComment = vbNullChar
   NullString.lpLocalName = vbNullChar
   NullString.lpProvider = vbNullChar
   NullString.lpRemoteName = vbNullChar

   '   leere Root-Struktur auf Microsoft übertragen
   MicrosoftRoot = NullString

   '   Wurzel des Netzwerkes finden
   ReturnValue = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, NullString, EnumHandle)

   '   Fehler aufgetreten?
   If (ReturnValue = 0) Then
   '   Nein, Größe des Zwischenspeichers festlegen
      SizeTestR = 4096 * 5

      '   Maximale Anzahl der Resourcen festlegen
      Count = &HFFFFFFFF

      '   Resourcen auslesen
      ReturnValue = WNetEnumResource(EnumHandle, Count, TestR(0), SizeTestR)

      '   Ist ein Fehler aufgetreten?
      If (ReturnValue = 0) Then
         '   Nein, Puffer in lokalen Array aus NETRESOURCE Struktur kopieren und nach "Microsoft" Provider suchen
         For Zaehler = 0 To Count
            '   String an der Adresse auslesen
            StringPtr = Pointer_to_String(TestR(Zaehler).lpRemoteName)

            ' Enthält der Text das Wort "Microsoft"?
            If (UCase(Left(StringPtr, 9)) = "MICROSOFT") Then
               '   Ja, also Informationen in die Root-Struktur kopieren
               MicrosoftRoot.dwDisplayType = TestR(Zaehler).dwDisplayType
               MicrosoftRoot.dwScope = TestR(Zaehler).dwScope
               MicrosoftRoot.dwType = TestR(Zaehler).dwType
               MicrosoftRoot.dwUsage = TestR(Zaehler).dwUsage
               MicrosoftRoot.lpComment = Pointer_to_String(TestR(Zaehler).lpComment)
               MicrosoftRoot.lpLocalName = Pointer_to_String(TestR(Zaehler).lpLocalName)
               MicrosoftRoot.lpProvider = Pointer_to_String(TestR(Zaehler).lpProvider)
               MicrosoftRoot.lpRemoteName = StringPtr
            End If
         Next Zaehler

         '   Resourcen schließen
         WNetCloseEnum EnumHandle

      End If
   End If

   '   Wurde eine Resource benannt?
   If (txtComputer vbNullString) Then
      '   Ja, handelt es sich um einen Computer?
      If (Left(txtComputer, 2) = "\\\\") Then
         '   Ja, also die Freigaben des Netzes ermitteln
         MachineContainer.lpProvider = MicrosoftRoot.lpProvider
         MachineContainer.lpRemoteName = txtComputer

         '   Handle zum Auslesen erstellen
         NetResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, MachineContainer, hEnum)

         '   Erfolgreich?
         If (NetResult = 0) Then
            '   Wiederholen, bis keine Freigaben mehr vorhanden sind.
            Do While (NetResult <> ERROR_NO_MORE_ITEMS)
               '   Systemevents verarbeiten
               DoEvents

               '   Speicher initialisieren
               Count = &HFFFFFFFF
               SizeTestR = 4096 * 5

               '   Die Freigaben ermitteln
               NetResult = WNetEnumResource(hEnum, Count, TestR(0), SizeTestR)

               '   Ist ein Fehler aufgetreten?
               If ((NetResult <> 0) And (NetResult <> ERROR_NO_MORE_ITEMS)) Then
                  '   Ja, also Schleife verlassen
                  Exit Do
               Else
                  For i = 0 To Count - 1
                     '   Die Daten kopieren
                     lString = Pointer_to_String(TestR(i).lpRemoteName)

                     '   Wurde eine Freigabe ermittelt?
                     If (lString <> vbNullString) Then
                        '   Den Computer wegschneiden
                        lString = Right(lString, Len(lString) - Len(ParentNodeName))

                        '   Freigabe ausgeben
                        Debug.Print lString & vbTab;

                        '   Typ der Freigabe ermitteln
                        If TestR(i).dwType = RESOURCETYPE_DISK Then
                           Debug.Print " ist ein Laufwerk"
                        Else
                           Debug.Print " ist ein Drucker"
                        End If
                     End If
                  Next i
               End If
            Loop
         End If
         '   Aufzählungshandle schließen oder Memory Leak erzeugen
         WNetCloseEnum hEnum
      End If
   End If
End Sub

Private Function Pointer_to_String(Pointer As Long) As String
   '   Speicher reservieren
   Dim Adresse As Long
   Dim Laenge As Long
   Dim Puffer As String

   '   Wenn der Pointer Null ist, dann gibt es einen Fehler
   If (Pointer <> 0) Then
      '   Länge des benötigten Speichers ermitteln
      Laenge = lstrlen(Pointer)

      '   Benötigten Speicher initialisieren
      Puffer = Space(Laenge + 1)

      '   Daten, auf die der Pointer zeigt, in den Speicher kopieren
      Adresse = lstrcpy(Puffer, Pointer)
   Else
      '   Keine daten vorhanden
      Puffer = vbNullString & vbNullChar
   End If

   '   Das abschließende NullChar beseitigen
   Pointer_to_String = Left(Puffer, InStr(Puffer, vbNullChar) - 1)
End Function

 GrüßeT-Rex 
bei Antwort benachrichtigen
Anonym T-Rex „Hallo, ein etwas längerer Code. Der Computername muß beide führenden...“
Optionen

Klasse,

das klappt ja prima! Danke erstmal.
Nun muss ich nur noch rauskriegen, wie ich auf Unterordner und Dateien zugreife und schon bin ich ein ganzes Stück weiter.
Weisst Du auch wie das geht? Wär echt toll. Danach lass ich Dich auch in Frieden.

PCO

bei Antwort benachrichtigen
T-Rex Anonym „VB: Liste der Freigaben in LAN“
Optionen

Wenn Du meinst, daß Du diese Ordner erst mal als Laufwerk anbinden möchtest, ist das kein Problem. Dann kannst Du da wie auf lokale Festplatten zugreifen (natürlich was langsamer).

Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" ( _
   lpNetResource As NETRESOURCE, _
   ByVal lpPassword As String, _
   ByVal lpUserName As String, _
   ByVal dwFlags As Long _
) As Long

Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" ( _
   ByVal lpName As String, _
   ByVal dwFlags As Long, _
   ByVal fForce As Long _
) As Long

Private Declare Function WNetGetConnection Lib "mpr" Alias "WNetGetConnectionA" ( _
   ByVal strLaufwerk As String, _
   ByVal strFreigabe As String, _
   intFreigabe As Long _
) As Long

Private Type tNETRESOURCE
   dwScope As Long
   dwType As Long
   dwDisplayType As Long
   dwUsage As Long
   lpLocalName As String
   lpRemoteName As String
   lpComment As String
   lpProvider As String
End Type

Private Const RESOURCETYPE_DISK = &H1

Public Function Trenne_Freigabe(strLaufwerk As String) As Integer
   '   Diese Funktion trennt eine Freigabe.
   '   Sollte es nicht klappen, wird vbNo zurückgegeben, sonst vbYes
   '   Speicher reservieren
   Dim ReturnValue As Long

   '   Rückgabewert setzen
   Trenne_Freigabe = vbNo

   '   Wenn ein Laufwerk übergeben wurde, dann weitermachen
   If (Len(strLaufwerk) = 2) Then
      '   Verbindung kappen
      ReturnValue = WNetCancelConnection2(strLaufwerk, 0, 0)
      '   Wenn erfolgreich, dann Rückgabewert neu setzen
      If (ReturnValue = 0) Then
         Trenne_Freigabe = vbYes
      End If
   End If
End Function

Public Function Verbinde_Freigabe(strLaufwerk As String, strFreigabe As String, Optional strUserName As String, Optional strUserPassWd As String) As Integer
   '   Diese Funktion verbindet eine Freigabe mit dem lokalen Rechner
   '   Ist die Funktion erfolgreich, wird vbYes zurückgegeben, sonst vbNo
   '   Speicher reservieren
   Dim NetRes As tNETRESOURCE
   Dim ReturnValue As Long

   '   Rückgabewert setzen
   Verbinde_Freigabe = vbNo

   '   Wenn ein Laufwerk übergeben wurde, dann weitermachen
   If (Len(strLaufwerk) = 2) Then
      '   Resourcen setzen
      NetRes.lpRemoteName = strFreigabe
      NetRes.lpLocalName = strLaufwerk
      NetRes.dwType = RESOURCETYPE_DISK

      '   Verbindung herstellen
      ReturnValue = WNetAddConnection2(NetRes, strUserName, strUserPassWd, 0)

      '   Wenn erfolgreich, dann Rückgabewert neu setzen
      If (returnvalue = 0) Then
         Verbinde_Freigabe = vbYes
      End If
   End If
End Function

Public Sub Lese_Netzlaufwerke()
   '   Speicher reservieren
   Dim ReturnValue As Long
   Dim sNetname As String
   Dim iLen As Long
   Dim iIdx As Integer
   Dim sDrive As String

   '   Alle Netzwerkverbindungen anzeigen
   For iIdx = Asc("D") To Asc("Z")
      sDrive = Chr$(iIdx) & ":"
      sNetname = Space$(255)
      iLen = Len(sNetname)
      ReturnValue = WNetGetConnection(sDrive, sNetname, iLen)
      If (ReturnValue = 0) Then
         Debug.Print sDrive & Left(sNetname, iLen)
      End If
   Next iIdx
End Function

 GrüßeT-Rex 
bei Antwort benachrichtigen
Anonym T-Rex „Wenn Du meinst, daß Du diese Ordner erst mal als Laufwerk anbinden möchtest,...“
Optionen

Nun, das hab ich schon...
Mein Ziel ist ein Up-/Download von einer Datei zu einer bestimmten Zeit von einem bestimmten Ort im Lan einen bestimmten Ort.

Dafür muss der Benutzer natürlich erstmal die Datei raussuchen.
Das Navigieren durch die Netzwerkumgebung und rauspicken der Adresse ist etwas unkomfortabel.

Dein 1. Programmcode in Verbindung mit dem 2. jetzt macht Laufwerksverknüpfungen möglich. Leider weiss ich noch nicht, wie ich Dateien anzeige und dann entsprechend downloade.

Ich gestehe es ist mein erster Ausflug mit VB in die Welt des LANs,...

PCO

bei Antwort benachrichtigen
T-Rex Anonym „VB: Liste der Freigaben in LAN“
Optionen

Ja ...

Wenn ich Dich richtig verstanden habe, soll das ganze eine Art "Explorer" werden.

Dafür hat VB zwei Controls:
- DirListBox
- FileListBox

Dann schreibst Du bei Deiner DirListBox im Click-Event:
File1.Path = Dir1.List(Dir1.ListIndex)

Jetzt werden alle Dateien im entsprechenden Ordner aufgelistet.

Hier noch ein paar Links für Dich:
Inhalt eines Verzeichnisses einlesen
Benutzerrechte lesen und setzen

Allerdings: Bei allen Beispielen mußt Du (habe keine andere Möglichkeit gefunden) die Freigabe erst mal an ein Laufwerk anbinden.
Dieses kannst Du dann durchsuchen.

 GrüßeT-Rex 
bei Antwort benachrichtigen