Seite 1 von 3
NetShareEnum oder wie kann ich alle Freigaben ermitteln
Verfasst: 09.08.2005 15:03
von DarkCrow
Hallo Leute,
bin jetzt schon eine ganze Zeit im Forum unterwegs und hab auch schon selbst gebastelt, aber es funktioniert einfach nicht
Hier mein angefangenes "Meisterwerk"
Code: Alles auswählen
Procedure ErmittleShares(server.s)
dwEntriesRead.l = 0
dwTotalEntries.l = 0
Structure SHARE_INFO_0
*shi0_netname.s
EndStructure
;NET_API_STATUS NetShareEnum(
; LPWSTR servername,
; DWORD level,
; LPBYTE* bufptr,
; DWORD prefmaxlen,
; LPDWORD entriesread,
; LPDWORD totalentries,
; LPDWORD resume_handle
;)
Resultat = NetShareEnum_(@server, 0, @BufPtr.SHARE_INFO_0, -1, @dwEntriesRead,@dwTotalEntries, #NULL)
; Resultat = NetShareEnum_(#NULL, 0, @si0Work.SHARE_INFO_0, -1, @dwEntriesRead,@dwTotalEntries, #NULL)
Debug Resultat
; MessageRequester("","TT" + &BufPtr\shi0_netname)
EndProcedure
Wie kann ich nun die Freigaben auslesen/ausgeben ... ich komm einfach nicht weiter!!! Hätte einer von euch etwas auf Lager, was mir helfen könnte?
Wäre das nicht auch ein Fall für die "Code, Tipps und Tricks"-Abteilung? Das braucht man doch öfters, oder? Also in Delphi hab ich es ganz einfach hinbekommen, nur muss ich es jetzt in PB schreiben ...
Wäre echt nett, wenn einer von euch das Brett vor meinem Kopf kleinhacken könnte^^
gruß DarkCrow
Verfasst: 09.08.2005 17:48
von Deeem2031
Is ja witzig, nach soeiner Proc hab ich vor paar monaten mal gesucht...
Naja, wenigstens hab ich sie zumindest teilweise zum laufen bekommen. Entweder bekomm ich es nicht hin einen gültigen DNS/NetBIOS-Namen zu bilden oder Windows ist zu doof um zu verstehen was ich meine, aber mit dem lokalen Computer funktionierts bei mir
Code: Alles auswählen
#MAX_PREFERRED_LENGTH = -1
Procedure ErmittleShares(server.s)
Protected dwEntriesRead.l, dwTotalEntries.l, *Buffer.LONG
Protected output.s ,outputLen.l, result.l
result = NetShareEnum_(0, 0, @*Buffer, #MAX_PREFERRED_LENGTH, @dwEntriesRead,@dwTotalEntries, #Null)
;result = NetShareEnum_(server, 0, @*Buffer, #MAX_PREFERRED_LENGTH, @dwEntriesRead,@dwTotalEntries, #Null)
If result = 0
For i = 0 To dwEntriesRead-1
*string.STRING = *Buffer\l
output = Space(256)
outputLen = WideCharToMultiByte_( #CP_ACP, 0, *string, -1, output, 256,0,0)
MessageRequester("Share("+Str(i)+")", output)
*Buffer+4
Next
NetApiBufferFree_(*Buffer)
Else
Debug "SystemError:" +Str(result)
EndIf
EndProcedure
ErmittleShares("\\i486")
Um's mit anderen Computern zu testen einfach die eine Zeile auskommentieren und die daüber löschen und unten eine gültige Adresse eingeben (was mir nicht gelungen ist).
Verfasst: 09.08.2005 17:54
von bobobo
Unicode !
Verfasst: 09.08.2005 18:01
von Deeem2031
Ah, natürlich, warum bin ich da nicht selber drauf gekommen:
Code: Alles auswählen
#MAX_PREFERRED_LENGTH = -1
Procedure ErmittleShares(server.s)
Protected dwEntriesRead.l, dwTotalEntries.l, *Buffer.LONG
Protected output.s ,outputLen.l, result.l
ServerUnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, server, -1, 0,0)
ServerUniCode = AllocateMemory(ServerUnicodeLen)
UnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, server, -1, ServerUniCode, ServerUnicodeLen)
result = NetShareEnum_(ServerUniCode, 0, @*Buffer, #MAX_PREFERRED_LENGTH, @dwEntriesRead,@dwTotalEntries, #Null)
If result = 0
For i = 0 To dwEntriesRead-1
*string.STRING = *Buffer\l
output = Space(256)
outputLen = WideCharToMultiByte_( #CP_ACP, 0, *string, -1, output, 256,0,0)
MessageRequester("Share("+Str(i)+")", output)
*Buffer+4
Next
NetApiBufferFree_(*Buffer)
Else
Debug "SystemError:" +Str(result)
EndIf
FreeMemory(ServerUniCode)
EndProcedure
ErmittleShares("\\sokrates\")
Thx, bobobo

Verfasst: 09.08.2005 18:55
von DarkCrow
Danke!!
Ihr seit meine rettung!
Wenn mein Programm völlig fertig ist, werd ich es hier posten ...
Verfasst: 09.08.2005 23:20
von Deeem2031
Habs mal noch ein "wenig" ausgebaut
Code: Alles auswählen
Structure SHARE_INFO_502
shi502_netname.l ;(UniCode)
shi502_type.l
shi502_remark.l ;(UniCode)
shi502_permissions.l
shi502_max_uses.l
shi502_current_uses.l
shi502_path.l ;(UniCode)
shi502_passwd.l ;(UniCode)
shi502_reserved.l
*shi502_security_descriptor.SECURITY_DESCRIPTOR
EndStructure
#MAX_PREFERRED_LENGTH = -1
#STYPE_DISKTREE = 0
#STYPE_PRINTQ = 1
#STYPE_DEVICE = 2
#STYPE_IPC = 3
#STYPE_SPECIAL = $80000000
#ACCESS_READ = $1
#ACCESS_WRITE = $2
#ACCESS_CREATE = $2
#ACCESS_EXEC = $8
#ACCESS_DELETE = $10
#ACCESS_ATRIB = $20
#ACCESS_PERM = $40
#ACCESS_ALL = #ACCESS_READ | #ACCESS_WRITE | #ACCESS_CREATE | #ACCESS_EXEC | #ACCESS_DELETE | #ACCESS_ATRIB | #ACCESS_PERM
Procedure.s DeCodeUnicode(unicodestring.l)
Protected output.s, outputLen.l
outputLen = WideCharToMultiByte_( #CP_ACP, 0, unicodestring, -1, 0, 0,0,0)
output = Space(outputLen)
WideCharToMultiByte_( #CP_ACP, 0, unicodestring, -1, output, outputLen,0,0)
ProcedureReturn output
EndProcedure
Procedure ErmittleShares(server.s)
Protected dwEntriesRead.l, dwTotalEntries.l, *Buffer.LONG
Protected output.s ,outputLen.l, result.l
ServerUnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, server, -1, 0,0)
ServerUniCode = AllocateMemory(ServerUnicodeLen)
UnicodeLen = MultiByteToWideChar_( #CP_ACP, 0, server, -1, ServerUniCode, ServerUnicodeLen)
result = NetShareEnum_(ServerUniCode, 502, @*Buffer, #MAX_PREFERRED_LENGTH, @dwEntriesRead,@dwTotalEntries, #Null)
If result = 0
;Debug dwEntriesRead
For i = 0 To dwEntriesRead-1
*SHARE_INFO.SHARE_INFO_502 = *Buffer
msg.s = DeCodeUnicode(*SHARE_INFO\shi502_netname)+#CRLF$
Select *SHARE_INFO\shi502_type & $7FFFFFFF
Case #STYPE_DISKTREE
msg + "Disk Drive"
Case #STYPE_PRINTQ
msg + "Print Queue"
Case #STYPE_DEVICE
msg + "Communication device"
Case #STYPE_IPC
msg + "Interprocess communication (IPC)"
EndSelect
If *SHARE_INFO\shi502_type & #STYPE_SPECIAL
msg + " (Special share)"+#CRLF$
Else
msg + #CRLF$
EndIf
msg + DeCodeUnicode(*SHARE_INFO\shi502_remark)+#CRLF$
Select *SHARE_INFO\shi502_permissions
Case #ACCESS_READ
msg + "read access"+#CRLF$
Case #ACCESS_WRITE
msg + "write access"+#CRLF$
Case #ACCESS_CREATE
msg + "create access"+#CRLF$
Case #ACCESS_EXEC
msg + "exec access"+#CRLF$
Case #ACCESS_DELETE
msg + "delete access"+#CRLF$
Case #ACCESS_ATRIB
msg + "modify the resource's attributes access"+#CRLF$
Case #ACCESS_PERM
msg + "modify the permissions access"+#CRLF$
Case #ACCESS_ALL
msg + "Permission to read, write, create, execute, and delete resources, and to modify their attributes and permissions"+#CRLF$
Default
msg +#CRLF$
EndSelect
If *SHARE_INFO\shi502_max_uses = -1
msg + "number of connections is unlimited"+#CRLF$
Else
msg + "max. number of connections: "+Str(*SHARE_INFO\shi502_max_uses)+#CRLF$
EndIf
msg + "current number of connections: "+Str(*SHARE_INFO\shi502_current_uses)+#CRLF$
msg + "local path: "+DeCodeUnicode(*SHARE_INFO\shi502_path)+#CRLF$
msg + "passwd: "+DeCodeUnicode(*SHARE_INFO\shi502_passwd)+#CRLF$
MessageRequester("Share("+Str(i)+")", msg)
*Buffer+SizeOf(SHARE_INFO_502)
Next
NetApiBufferFree_(*Buffer)
ElseIf result = #ERROR_MORE_DATA
NetApiBufferFree_(*Buffer)
Else
Debug "SystemError:" +Str(result)
EndIf
FreeMemory(ServerUniCode)
EndProcedure
ErmittleShares("\\sokrates")
Verfasst: 10.08.2005 11:33
von Agent
Hi Leutz.
Bin grad zufällig über den interessanten Code stolpert...
Bei mir bekomme ich im DebuggerWin nur "SystemError 5" wenn ich \\meinpc\ eingeb. bei localhost bekomm ich 53 usw...
Verfasst: 10.08.2005 14:06
von Deeem2031
Dann guckt man einfach mal nach was die Errors bedeuten:
System Error Code 5: Access is denied.
System Error Code 53: The network path was not found.
Verfasst: 10.08.2005 15:54
von bobobo
geht auch so
Code: Alles auswählen
For i=1 To 15000
Errornummer=i
buff$=Space(256)
FormatMessage_( #FORMAT_MESSAGE_FROM_SYSTEM,lpSource,Errornummer,0,buff$,256,Arguments)
If buff$<>Space(256)
Debug Str(Errornummer)+" :: "+buff$
EndIf
Next i
Verfasst: 18.08.2005 07:48
von PAMKKKKK
@ deeem & Bobo
vor President
What ein geiler Code.
den hab ich gerade gebraucht.
Andre !!!! Tu das ins CodeArchiv!!!