Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0646: Freigegebene Verzeichnisse mittels NetShareEnum erfassen

 von 

Beschreibung 

Dieser Tipp zeigt, ähnlich dem Befehl net view \\PC die Freigaben eines einzelnen PCs an.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

RtlMoveMemory (CopyMemory), NetApiBufferFree, NetShareEnum, lstrlenW

Download:

Download des Beispielprojektes [4,31 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text1"
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Schaltfläche "Command1"

Option Explicit

Private Enum eShareTyp
    Freigegebener_Ordner = 0
    Druckerwarteschlange = 1
    Device = 2
    IPC = 3
    DFS = 100
    Spezial = &H80000000
End Enum

Private Sub Command1_Click()
    Dim Shares() As tShare
    Dim i As Long
    List1.Clear
    
    ' Shares ermitteln und bei Fehler Meldung anzeigen
    If Not ErmittleShares(Text1.Text, Shares) Then
        List1.AddItem "--- Es ist ein Fehler aufgetreten ---"
        Exit Sub
    End If
    
    On Error Goto Leer
    
    For i = 0 To UBound(Shares)
        List1.AddItem "--- " + Shares(i).Name + " ---"
        
        Select Case Shares(i).Typ
        
        Case Freigegebener_Ordner
            List1.AddItem "Typ:" + vbTab + vbTab + "Freigegebener Ordner"
            
        Case Druckerwarteschlange
            List1.AddItem "Typ:" + vbTab + vbTab + "Druckerwarteschlange"
            
        Case Device
            List1.AddItem "Typ:" + vbTab + vbTab + "Device"
            
        Case IPC
            List1.AddItem "Typ:" + vbTab + vbTab + _
                "IPC (InterProcessCommunication)"
                
        Case DFS
            List1.AddItem "Typ:" + vbTab + vbTab + _
                "DFS (Distributed File System)"
            
        Case Spezial
            List1.AddItem "Typ:" + vbTab + vbTab + "Spezial"
            
        Case Else
            List1.AddItem "Typ:" + vbTab + vbTab + "Unbekannter Typ: " & _
                Shares(i).Typ
            
        End Select
        
        ' Falls keine Beschreibung existiert, lassen wir diese weg.
        If Len(Shares(i).Beschreibung) > 0 Then
            List1.AddItem "Beschreibung:" + vbTab + Shares(i).Beschreibung
        End If
        
        List1.AddItem ""
    Next i
    Exit Sub
    
Leer:
    List1.AddItem "--- Es sind keine Shares freigegeben ---"
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------

Option Explicit

Private Declare Function NetShareEnum Lib "netapi32.dll" ( _
    ByVal servername As Long, _
    ByVal level As Long, _
    ByVal bufptr As Long, _
    ByVal prefmaxlen As Long, _
    ByRef entriesread As Long, _
    ByRef totalentries As Long, _
    ByRef resume_handle As Long _
    ) As Long
    
Private Declare Function NetApiBufferFree Lib "netapi32.dll" ( _
    ByVal buffer As Long) As Long
    
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias _
    "RtlMoveMemory" (destination As Any, source As Any, _
    ByVal length As Long)
    
Private Declare Function lstrlenW Lib "kernel32.dll" ( _
    ByVal strptr As Long) As Long

Public Type tShare
    Name As String
    Typ As Long
    Beschreibung As String
End Type

Public Function ErmittleShares(ByVal Server As String, Shares() As tShare) As _
    Boolean
    Dim Gelesen As Long
    Dim Puffer As Long
    Dim Resultat As Long
    Dim ResumeHandle As Long
    Dim Total As Long
    Dim i As Long
    
    ' HINWEIS: Da wir für prefmaxlen den Wert -1 verwenden,
    ' berichtet uns die Funktion NetShareEnum wirklich alles.
    ' Aus diesem Grund ist zum einen die Variable Gelesen
    ' gleich der Variablen Total, ebenso ist ResumeHandle un-
    ' nötig, da diese nur verwendet wird, um bei zu kleinem
    ' Puffer später an der gleichen Stelle weiterzumachen,
    ' an der man aufgehört hat.
    
    Resultat = NetShareEnum(strptr(Server), 1, VarPtr(Puffer), -1, _
        Gelesen, Total, ResumeHandle)
        
'   Resultat = NetShareEnum(strptr(Server), 1, Puffer, -1, Gelesen, Total, _
        ResumeHandle)
    
    Debug.Print Resultat
    
    If Resultat = 0 And Gelesen > 0 Then
        ReDim Shares(0 To Gelesen - 1)
        For i = 0 To Gelesen - 1
            With Shares(i)
    ' Hinweis: Aus irgendeinem Grund sind selbst die Long-Variablen
    ' in der Rückgabestruktur nur Pointer, sodass wir diese über die
    ' Funktion Dereferenz_Long dereferenzieren müssen. Bei den
    ' Strings müssen wir dann gleich zwei Dereferenzierungen durch-
    ' führen: Einmal, um den Pointer zu dem Long-Wert, der als Poin-
    ' ter für den String dient, zu dereferenzieren, und dann, um
    ' diesen Long-Wert wieder zu dereferenzieren und einen String zu
    ' erhalten.
    ' Die Variable Puffer liefert uns einen Pointer auf ein Array
    ' von SHARE_INFO_1-Strukturen. Dieses besteht aus drei Long-
    ' Werten, damit ist eine Struktur 12 Byte groß. Wir springen
    ' deshalb auch jedesmal 12 Byte weiter.
                .Name = Dereferenz_String(Dereferenz_Long(Puffer + 12 * i))
                .Typ = Dereferenz_Long(Puffer + 12 * i + 4)
                .Beschreibung = Dereferenz_String(Dereferenz_Long(Puffer + 12 _
                    * i + 8))
            End With
        Next i
        
        ErmittleShares = True
    End If
    
    ' Falls NetShareEnum Speicher belegt hat, muss dieser wieder freigegeben
    ' werden
    If CBool(Puffer) Then
       NetApiBufferFree Puffer
    End If
End Function

' Dereferenzierung eines Pointer auf einen Long
Private Function Dereferenz_Long(ByVal Pointer As Long) As Long
    Call CopyMemory(Dereferenz_Long, ByVal Pointer, 4)
End Function

' Dereferenzierung eines Pointers auf einen String
Private Function Dereferenz_String(ByVal Pointer As Long) As String
    Dim Laenge As Long
    Dim Puffer() As Byte
    
    If CBool(Pointer) Then
        Laenge = lstrlenW(Pointer) * 2
        If CBool(Laenge) Then
            ReDim Puffer(Laenge - 1) As Byte
            CopyMemory Puffer(0), ByVal Pointer, Laenge
            Dereferenz_String = Puffer
        End If
    End If
End Function
'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 11 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Peter Bialkowski am 31.07.2008 um 20:02

Sorry,
hatte die Liste oben übersehen. Schade, dass es unter Win98 nicht läuft.

Kommentar von Peter Bialkowski am 30.07.2008 um 20:21

Hallo Ihr Lieben,
habe mir das Beispielprojekt Tipp 0646 runtergeladen, aber leider funktioniert es bei mir nicht. Bekomme immer die Fehlermeldung: DLL-Einsprungpunkt NetShareEnum in netapi32.dll nicht gefunden. Die DLL befindet sich im Windows Systemordner. Ich benutze VB6 unter Win98 SE.
Es wäre super, wenn Ihr mir helfen könntet.

Vielen Dank

Peter

Kommentar von Juergen Goldau am 01.11.2007 um 14:15

Moin,

Dake für den Tip; rennt mit VB6 bestens.

Allerdings kann auch bei -1 fuer prefMaxLen ERROR_MORE_DATA zurueckkommen. ResumeHandle muss dann auf die Anzahl der bisher gelesenen Eintraege + 1 gesetzt werden, damit klar ist, ab welcher Position die naechsten Eintraege zu lesen sind. Sinnvollerweise packt mann das Ganze dann zwischen ein Do...While das solange laeuft bis Resultat <> ERROR_MORE_DATA.

Viele gruesse, Juergen

Kommentar von am 02.04.2005 um 19:44

Damit alles funktioniert muss die Deklaration von NetShareEnum
geändert werden. Paramter 1 sollte String sein, Parameter 2 sollte als Referenz übergeben werden.

Kommentar von Silvio am 14.02.2005 um 14:41

Vielen Dank für deine Erweiterung mit den freigegebenen Verzeichnis des eigenen PCs.

Gibt es eine Möglichkeit für Win 9X

Gruß Silvio

Kommentar von Silvio am 20.01.2005 um 18:02

Kann ich mit dieser Routine irgendwie auch das freigegebene Verzeichnis herausbekommen, so dass ich in einen eigenen Explorer ein entsprechendes Symbol (Verzeichnisbild mit Hand) im Treeview anzeigenlassen kann.

Gibt es eine Alternative für Win 9X?

Kommentar von Lutz von der Burchard am 01.12.2004 um 20:28

Hi,
meines erachtens musst du auch \\Computername angeben! Oder sehe ich da was falsch?

Kommentar von Albert2000 am 11.10.2004 um 23:09

Hmm.. entweder bin ich blöder oder das geht nicht. Ich habe "//Computername" eingegeben.

Ich bekomme eine Fehlermeldung "Speicher .... verweist auf ungültigen Speicherbereicht..." (so ähnlich) und VB schmiert ab.

Was nun?

Kommentar von Albert2000 am 11.10.2004 um 13:43

Danke, werd ich heut Abend gleich ausprobieren...

Kommentar von Jonas am 10.10.2004 um 16:53

@ Albert

In der Textbox musst du den Namen des Computers angeben, dessen Freigaben du angezeigt bekommen willst.

Kommentar von Albert2000 am 09.10.2004 um 15:12

Hmm.. funktioniert bei mir nicht. Was muss ich denn in dieses Edit eingeben? Meine IP? Hat auch nicht wirklich funktioniert....

Win XP, VB6 Sp weiß ich nicht...

Kann wer helfen?