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 :cry:

Hier mein angefangenes "Meisterwerk" :freak:

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... :roll:

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 :allright:

What ein geiler Code.

den hab ich gerade gebraucht.

Andre !!!! Tu das ins CodeArchiv!!!