NetShareEnum oder wie kann ich alle Freigaben ermitteln

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
DarkCrow
Beiträge: 18
Registriert: 04.01.2005 16:35
Wohnort: Altrip
Kontaktdaten:

NetShareEnum oder wie kann ich alle Freigaben ermitteln

Beitrag 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
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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).
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Unicode !
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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 :)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
DarkCrow
Beiträge: 18
Registriert: 04.01.2005 16:35
Wohnort: Altrip
Kontaktdaten:

Beitrag von DarkCrow »

Danke!!

Ihr seit meine rettung!

Wenn mein Programm völlig fertig ist, werd ich es hier posten ...
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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")
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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...
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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

‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von PAMKKKKK »

@ deeem & Bobo
vor President :allright:

What ein geiler Code.

den hab ich gerade gebraucht.

Andre !!!! Tu das ins CodeArchiv!!!
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Antworten