VB 5/6-Tipp 0646: Freigegebene Verzeichnisse mittels NetShareEnum erfassen
von Eckhart Wörner
Beschreibung
Dieser Tipp zeigt, ähnlich dem Befehl net view \\PC die Freigaben eines einzelnen PCs an.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: RtlMoveMemory (CopyMemory), NetApiBufferFree, NetShareEnum, lstrlenW | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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?