Wie greife ich in .NET mit fremden Credentials auf einen UNC-Pfad zu? (Gibt's da einen g'scheiten Weg?)

HEHE Olga 20 Zuverlässigkeitspunkte
2026-04-27T11:59:29.0766667+00:00

Ich arbeite grad an einer .NET-App in unserer Windows-Firmenumgebung und versuch, mit bestimmten Zugangsdaten Dateien aus einem freigegebenen Netzwerkordner zu ziehen, aber er verweigert einfach die Verbindung.

Ich hab schon probiert, ein NetworkCredential aufzusetzen und es in einen CredentialCache zu hauen, um dann Directory.GetFiles aufzurufen. Aber da kommt absolut nix durch und das macht mich langsam echt narrisch! Das Ganze liegt auf einem File-Server der Firma, der einem anderen Team gehört, und ich muss da mit den Kontoberechtigungen von einem anderen Rechner drauf zugreifen.

Gibt's da irgendeinen g'scheiten Weg zur Authentifizierung oder überseh ich da was komplett Offensichtliches?

Windows für Unternehmen | Windows für IoT
0 Kommentare Keine Kommentare

1 Antwort

Sortieren nach: Am hilfreichsten
  1. Tracy Le 13,050 Zuverlässigkeitspunkte Unabhängiger Berater
    2026-04-27T12:38:05.19+00:00

    Hallo HEHE Olga,

    Mach dich nicht verrückt! Dass du hier hängen bleibst, liegt an einem klassischen .NET-Irrtum: System.IO-Klassen (wie Directory.GetFiles) ignorieren NetworkCredential und CredentialCache komplett. Diese Objekte sind ausschließlich für Web-Protokolle (HTTP/FTP) gedacht.

    Wenn du auf einen Windows-Dateiserver (SMB/UNC) zugreifst, verwendet das Betriebssystem auf unterster Ebene immer das Security-Token des aktuell ausführenden Threads, völlig egal, was du davor im Code als Credential-Objekt definierst.

    Der "g'scheite Weg" (Die Lösung): Du musst einen echten Identitätswechsel (Impersonation) auf Thread-Ebene durchführen. Der sauberste und effizienteste Weg, ohne hunderte Zeilen komplexer Win32-APIs (LogonUser aus advapi32.dll) selbst zu schreiben, ist das etablierte NuGet-Paket SimpleImpersonation.

    So einfach sieht die funktionierende Architektur dann aus(C#):

    using System.IO;
    using SimpleImpersonation;
    // ...
    using (Impersonation.LogonUser("DeineDomain", "DeinUser", "DeinPasswort", LogonType.NewCredentials))
    {
        // Innerhalb dieses Blocks nutzt das Betriebssystem die neuen Berechtigungen!
        string[] files = Directory.GetFiles(@"\\Server\Freigabe");
        
        // Mach was mit den Dateien...
    }
    

    Vergiss NetworkCredential für Dateipfade. Implementiere diese Impersonation, und die Zugriffsverweigerung ist Geschichte!

    Tracy Le.

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare

Ihre Antwort

Antworten können von Fragestellenden als „Angenommen“ und von Moderierenden als „Empfohlen“ gekennzeichnet werden, wodurch Benutzende wissen, dass diese Antwort das Problem des Fragestellenden gelöst hat.