Autor Beitrag
yndaso
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mo 11.07.11 09:57 
Hallo,
habe ein kleines Problem mit dem Zugriff auf eine Datei.
Und zwar liegt auf einem externen Rechner eine xml Datei ab, die ich in meiner lokalen Anwendung einlese will.

ausblenden C#-Quelltext
1:
DataSet ds = readXml(@"\\192.168.0.64\XML_Files\config.xml");					


Es klappt nicht die Datei einzulesen, da der PC Benutzernamen und Kennwort braucht.
Greife ich einmalig manuell auf die Datei zu, so erscheint ein Anmeldebildschirm.
Nach erfolgreichem Einloggen, funktioniert dann auch der Zugriff aus meiner Anwendung heraus.

Nun meine Frage, wie kann ich das einloggen in meine Anwendung integrieren?

Danke
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 11.07.11 10:11 
Wenn es diesen User dessen Credentials du brauchst nur auf dem anderen Rechner existiert (bzw. der User kein Domänenuser ist oder es lokal keinen entsprechenden Account gibt) wirst du wohl per PInvoke ein Connection zu diesem Share über die WNetAddConnection2 bzw. WNetAddConnection3 WinAPI Methode aufmachen müssen.
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mo 11.07.11 10:18 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es diesen User dessen Credentials du brauchst nur auf dem anderen Rechner existiert (bzw. der User kein Domänenuser ist oder es lokal keinen entsprechenden Account gibt) wirst du wohl per PInvoke ein Connection zu diesem Share über die WNetAddConnection2 bzw. WNetAddConnection3 WinAPI Methode aufmachen müssen.


Danke für die schnelle Antwort. Aber verstehen tu ich dies nicht 100 pro.

Ich habe auf dem entfernten pc vollzugriff und habe dort eine ganz normale datenfreigabe auf den Ordner eingerichtet.
Wie würde das in diesem Fall funktionieren? Nzw. welche Methoden wären die geeigneten?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 11.07.11 10:52 
Zitat:
Ich habe


Wenn 'ich habe' bedeutet das der User mit dem du angemeldet bist auf dem anderen Rechner auch existiert und irgendwelche Rechte hat gibt es noch ein paar andere Lösungen. Ansonsten ist WNetAddConnection die einzige Methode die ich kenne(heißt es mag durchaus auch andere geben) die es zulässt über einen reinen Remote User auf einen Remote Share zuzugreifen. Das erstellte Laufwerksmapping kannnst du ja im Anschluss wieder löschen.
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mo 11.07.11 12:52 
Ich weiß ja, dass es nicht der Sinn eines Forums ist fertige Lösungen zu präsentieren.

Aber ich komme mit der msdn Beschreibung WNETAddConnection2 nicht mal ansatzweise zurecht.
Die google suche nach Beispielen ist ebenso bis jetzt von erfolglosigkeit geprägt.

Kann mir evtl. mal jemand das genauer erklären, bzw. ein leicht verständlicheres beispiel
zeigen?
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mo 11.07.11 13:16 
Kurzes Update.
Ich habe es nun mittels einem Beispiel geschafft das Laufwerk zu mappen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        NETRESOURCE myNetResource = new NETRESOURCE();
        myNetResource.lpLocalName = drive;
        myNetResource.lpRemoteName = unc;
        myNetResource.lpProvider = null;
        int result = WNetAddConnection2(myNetResource, password, user, 0);


Wie würde man dieses gemappte laufwerk wieder entfernen?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 11.07.11 13:19 
Hallo,

von C# aus muß man mittels P/Invoke auf WinAPI-Funktionen zugreifen. Als beste Sammlung hat sich hierfür die Seite pinvoke.net etabliert.
Für deine Funktion also pinvoke.net/default....tAddConnection2.html

Btw. du kannst auch die einfachere Funktion pinvoke.net/default....api32/NetUseAdd.html dafür benutzen (der Laufwerkbuchstabe muß ja nicht im Explorer angezeigt werden, da du die Verbindung ja nur innerhalb deines Programmes öffnen willst).

P.S: Und zum Entfernen der Verbindung pinvoke.net/default....WNetCancelConnection bzw. pinvoke.net/default....NetCancelConnection2
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 11.07.11 13:50 
NetUseAdd ist ein guter Hinweis. Es scheint so das man auf die Angabe des lokalen Laufwerks auf das gemappt wird verzichten kann. Einfach im USE_INFO_2 struct ui2_local auf Null belassen. Dann hat man eine reine Authentifizierung und man erübrigt sich das spätere Entfernen des Mappings.