Seite 1 von 1
NetShareEnum - Zugriff verweigert
Verfasst: 29.11.2007 13:52
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
Verfasst: 29.11.2007 15:52
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")
Verfasst: 29.11.2007 16:49
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

Verfasst: 29.11.2007 17:15
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
Verfasst: 29.11.2007 17:45
von Daniel P.
Och nööö - doch so einfach?
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

Verfasst: 29.11.2007 21:32
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.
Ciao
jpd
Verfasst: 29.11.2007 21:45
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...
Verfasst: 30.11.2007 00:34
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")
Verfasst: 30.11.2007 13:45
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!
[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

Verfasst: 30.11.2007 13:51
von jpd
Gern geschehen Daniel!
Ciao
jpd