NetShareEnum - Zugriff verweigert

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

NetShareEnum - Zugriff verweigert

Beitrag von Daniel P. »

Hi,

ich habe ein kleines Problem mit der o. g. API-Funktion "NetShareEnum". Und zwar möchte ich auf einem Server alle Freigaben auslesen. Problem ist nur, dass der Server per Benutzername, Passwort geschützt ist und eine anonyme Auflistung der Shares nicht zulässt. Nur kann man "NetShareEnum" keinen Benutzernamen, Passwort übergeben (ähnlich wie es zum Beispiel bei "WNetAddConnection" ist) und folglich erhalte ich beim Aufruf von "NetShareEnum" den Fehlercode 5 (Zugriff verweigert). Es funktioniert nur, wenn ich bereits eine Verbindung zum Server aufgebaut habe (beispielsweise ein Netzlaufwerk gemountet ist) oder ich mein lokales Benutzerprofil so ändere, dass Benutzername und Passwort auf dem Server und auf meinem lokalen Rechner gleich sind. Beide Wege sind aber sehr bescheiden. Gibt es eventuell einen Weg, vor dem Aufruf von "NetShareEnum" einen Benutzernamen samt Passwort festzulegen oder dieses "CONNECT_UPDATE_PROFILE" (wo gültige Verbindungen gespeichert werden) so zu manipulieren, dass ich ohne Umwege die Shares auslesen kann? Geht das eventuell über die Funktion "NetUserAdd"? Denn ich habe einige Codebeispiele gefunden, wo diese Funktion vor dem Aufruf von "NetShareEnum" aufgerufen wurde - aber aus den paar Code-Fetzen bin ich nicht schlau geworden :(

THX & Gruß
Daniel
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hallo Daniel,

mit diesen beispiel müsste es funktionieren.

Ciao
jpd

Code: Alles auswählen

Procedure ConnectIPC(Computername.s,UserName.s,Password.s) 
  Protected Resource.s,ErrInfo.l
  
  Resource.s=Computername+"\IPC$"
 
  NetR.NETRESOURCE 
  ErrInfo.l 
  MyPass.s 
  MyUser.s 
  NetR\dwScope = #RESOURCE_GLOBALNET 
  NetR\dwType = #RESOURCETYPE_DISK 
  NetR\dwtype=#RESOURCETYPE_ANY 
  NetR\dwDisplayType = #RESOURCEDISPLAYTYPE_SHARE 
  NetR\dwUsage = #RESOURCEUSAGE_CONNECTABLE 
  NetR\lpRemoteName =@Resource.s; Your valid share 
  
  ErrInfo = WNetAddConnection2_(NetR, Password, UserName, #CONNECT_UPDATE_PROFILE) 
  If ErrInfo = #NO_ERROR 
    Debug  Resource +" Connected Successful!" 
  
  Else 
    Debug Resource +" ERROR: " +Str( ErrInfo ) 
   
  EndIf 
EndProcedure 


ConnectIPC("\\computername","computername\username","password") 
Zuletzt geändert von jpd am 29.11.2007 17:16, insgesamt 1-mal geändert.
PB 5.10 Windows 7 x64
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Wie ich zu einem Netzlaufwerk verbinde, weiß ich ja schon und das funktioniert auch ohne Probleme. Nur würde ich gerne auf einem Server, auf dem ich nicht angemeldet bin, alle Freigaben mit "NetShareEnum" auslesen. Das funktioniert aber nicht, da mir der Zugriff verweigert wird - logisch, ich bin ja nicht angemeldet. Wenn ich mich anmelde, funktioniert's, denn Windows speichert, solange die Anmeldung besteht, meine Zugangsdaten zum Server, die offenbar von "NetShareEnum" verwendet werden. Ich suche momentan nach einem Weg, diese Zugangsdaten ohne eine direkte Verbindung zum Server zu setzen. Angeblich soll's mit "LogonUser" funktionieren, tut es bei mir aber nicht - ist nur für lokale Anmeldung :cry:
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi Daniel,

eine anmeldung am Server musst du herstellen so oder so :-)

mit den beispiel wird eine anmeldung an IPC$ ausgeführt
also es wird kein laufwerk gemappt.

dadurch holst du dir die benötigte berächtigungen zum ausführen weitere netzwerk jobs wie netshareenum oder communication mit dem SCM und so weiter...

Die Freigabe IPC$ wird bei temporären Verbindungen zwischen Clients und Servern über Named Pipes für die Kommunikation zwischen Netzwerkprogrammen verwendet. Sie wird in erster Linie für die Remoteverwaltung von Netzwerkservern genutzt.
werde gleich die routine umbenennen so das es nicht zu verwirrung führt!

Ciao
jpd
PB 5.10 Windows 7 x64
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Och nööö - doch so einfach? :freak:

Warum können die das nicht so in die MSDN schreiben? Auf sowas muss man erst mal kommen. Also jetzt klappt alles prima - aber eine Frage hätte ich noch: Gibt's eine Möglichkeit, diese Anmeldedaten wieder zu verwerfen? Denn nach der Programmausführung bleiben die bis zum nächsten Neustart bestehen und wirklich gefallen tut mir das nicht ;)
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi Daniel,

ich glaube dafür muss du warcheinlich diese daten in eine veschlüsselte datei ablegen.

Dies wiederum würden irgend wann durch ein password änderung nicht mehr gültig sein und dann hättest du dein nächstes problem. :o

Ciao
jpd
PB 5.10 Windows 7 x64
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Wieso verschlüsselte Datei? Ich bräuchte so eine Art Disconnect-Funktion, damit Windows diese "gemerkten" Daten nicht für eine ungewollte Anmeldung am Server verwenden kann - denn das macht es gerade. Zum Beispiel melde ich mich per Programmcode als "root" an. Das Programm erledigt seine Dinge auf dem Shared Volume und wird beendet. Meldet sich nun der Benutzer via "Netzlaufwerk verbinden" an diesem Volume an, wird er automatisch als "root" angemeldet, weil sich Windows durch deine Connect-Funktion die Anmelde-Daten gemerkt hat. Das darf aber nicht sein, wenn der Benutzer keine "root"-Rechte haben darf und sich mit einem eigenen Zugang anmelden soll. Deswegen muss das Programm diese Anmelde-Daten irgendwie verwerfen...
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi Daniel,
jo! interessante sache...
ich hatte eigentlich was anderes verstanden, sorry!

hier bin mir nicht 100% sicher das es genau das macht was du möchtest, kann morgen überprüfen,

erste test am meinen rechner scheinen zu funktionieren.





aus dem englichen forum:

http://www.purebasic.fr/english/viewtop ... onnection2

Code: Alles auswählen


Procedure DisconnectIPC(computername.s)
Protected Resource.s

Resource=computername+"\IPC$"

; Remove assigned connection ------------------------------ 
; ------ (ptr to resource name, flag - 0 or #CONNECT_UPDATE_PROFILE, #TRUE (force disconnect) or #FALSE (fail if open files or jobs) 
If WNetCancelConnection2_(@Resource,0, #True) = #NO_ERROR 
  MessageRequester ("Cool!", "Disconnected successfully", #MB_ICONINFORMATION) 
Else 
  MessageRequester ("Drat!", "Couldn't disconnect -- remove connection manually", #MB_ICONERROR) 
EndIf 
EndProcedure
 

DisconnectIPC("\\computername")



PB 5.10 Windows 7 x64
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Ja, es funktioniert. Und es steht sogar in der MSDN (unter WNetCancelConnection2):
lpName

If this parameter specifies a redirected local device, the function cancels only the specified device redirection. If the parameter specifies a remote network resource*, all connections without devices are canceled.

*zum Beispiel "\\192.168.X.X"
Allerdings funktioniert es nicht, wenn bereits eine funktionierende Verbindung zum Server besteht. Das ist etwas bescheiden, da "NetShareEnum" dann diese Verbindung zum Auflisten der Shares verwendet, anstatt eine eigene über andere Zugangsdaten. Da ich allerdings denke, dass die wenigsten Leute mit verschiedenen Zugangsdaten auf ein Shared Volume zugreifen, sollte das verschmerzbar sein...

BTW hab ich mich schon für die prima Hilfe bedankt? Danke! <) :allright:

[edit]
Dass die Möglichkeit einer "silent" Verbindung (IPC) nicht in der MSDN steht, stimmt so auch nicht. Folgendes steht bei "WNetCancelConnection2" unter "lpLocalName":
If the string is empty, or if lpLocalName is NULL, the function makes a connection to the network resource without redirecting a local device.
Tolle Wurst. Also verbindet man ohne lpLocalName zur IPC-Resource und kann dann ganz normal "WNetAddConnection2" verwenden :freak:
Zuletzt geändert von Daniel P. am 30.11.2007 13:55, insgesamt 1-mal geändert.
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Gern geschehen Daniel! :D

Ciao
jpd
PB 5.10 Windows 7 x64
Antworten