HaikoFalk
Software Engineer

Dateien über eine Netzwerkfreigabe herunterladen


Die Aufgabe war relativ einfach: Ein Filezugriff auf eine Netzwerkfreigabe mit gegebenen Benutzernamen, Domain und Password.

Anders jedoch als bei einem WebRequest, bei dem man eine NetworkCredential Objekt erzeugt und dem WebRequest zuweist, geht das scheinbar mit Dateiverzeichnissen nicht ganz so einfach.

WebRequest request = HttpRequest.Create(url);
request.Credentials = new NetworkCredentials(user, password);
WebResponse result = request.GetResponse();

Mein Traum wäre ja ein identisches vorgehen für ein DirectoryInfo Objekt gewesen, das gibt es aber nicht. Eine Suche zeigte jedoch diese einfache Möglichkeit auf:

Mit der WNetUseConnection Klasse sollte es einfach und schnell gehen. Stattdessen, jeder Entwickler kennt das, gab es unerklärliche Fehler.

Also was neues Ausprobieren: Der Impersonater gab mir zumindest konsequent zurück, dass der Benutzername oder das Password falsch sei. Auch verschiedene ConnectionTypes lösten das Problem nicht.

Lösungsansatz drei - denn alle guten Dinge sind drei ;) - gibt es z.b. hier im msdn Forum und auch das Beispiel in dem msdn Artikel über StandartErrors.

Mit NET USE den Ordner mappen, auf die Dateien zugreifen und das Mapping wieder zurücknehmen. Der NET USE Befehl ist hat dabei die folgene Syntax:

 

Um ihn aus der Applikation heraus aufrufen zu können nutz man dieses vereinfachte Code schnippsel:

System.Diagnostics.Process process = System.Diagnostics.Process.Start("net.exe", "use " + parameter);

Den <devicename> bestimme ich zuvor (z.B.: „Z:“). Im neuen Laufwerk „Z:“ finde ich dann meine Dateien und im Anschluss kann net use <devicename> /delete das mapping wieder auflösen.

Hier nocheinnmal der ganze Code:

Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("net.exe ", "use z: " + <NETWORKPATH> <PASSWORD> /user:<DOMAIN>\<USER>");
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.RedirectStandardError = true;
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();
StreamReader myStreamReader = myProcess.StandardError;
// errors auslesen
string error = myStreamReader.ReadLine();
myProcess.Close();
if (string.IsNullOrEmpty(error))
{
// erfolgreich ... also weiter
}
else
{
// FEHLER
}
Process.Start("net.exe ", "use z: /delete");

Viel Spass damit und viel Erfolg!

Haiko

Kommentare
Es wurden noch keine Kommentare zu diesem Eintrag geschrieben.
Kommentar hinzufügen
Vor und Zuname
E-Mail
E-Mail bei weiteren Kommentaren
Mein Kommentar