2014-09-01 11 views
5

Ich möchte alle freigegebenen Verzeichnisse von einem Netzwerkserver auflisten.Alle freigegebenen Ordner von einem Netzwerkstandort auflisten

aufzulisten Verzeichnisse aus einem Netzwerkverzeichnis geteilt habe ich

Directory.GetDirectories(@"\\server\share\") 

Das Problem ist, ich alle Ordner auf \\server auflisten möchten.

Wenn ich die gleiche Methode verwenden, erhalte ich eine Ausnahme zu sagen

Der UNC-Pfad des Formulars \ server \ share sollte

ich überall sah und ich kann nicht finde eine Lösung dafür.

Hat jemand eine Idee, was ich tun soll, um die Ordner in \\share anzuzeigen?

+0

mögliches Duplikat von [Eine Liste aller freigegebenen UNC-Ordner auf einem lokalen Netzwerkserver abrufen] (http://stackoverflow.com/questions/3567063/get-a-list-of-all-unc-shared-folders- on-a-local-network-server) – kamaradclimber

Antwort

1

Die beste Lösung war ich finden konnte „net“ App aus einem verborgenen cmd.exe Beispiel zu nennen:

public static string[] GetDirectoriesInNetworkLocation(string networkLocationRootPath) 
{ 
    Process cmd = new Process(); 
    cmd.StartInfo.FileName = "cmd.exe"; 
    cmd.StartInfo.RedirectStandardInput = true; 
    cmd.StartInfo.RedirectStandardOutput = true; 
    cmd.StartInfo.CreateNoWindow = true; 
    cmd.StartInfo.UseShellExecute = false; 
    cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    cmd.Start(); 
    cmd.StandardInput.WriteLine($"net view {networkLocationRootPath}"); 
    cmd.StandardInput.Flush(); 
    cmd.StandardInput.Close(); 

    string output = cmd.StandardOutput.ReadToEnd(); 

    cmd.WaitForExit(); 
    cmd.Close(); 

    output = output.Substring(output.LastIndexOf('-') + 2); 
    output = output.Substring(0, output.IndexOf("The command completed successfully.")); 

    return 
     output 
      .Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) 
      .Select(x => System.IO.Path.Combine(networkLocationRootPath, x.Substring(0, x.IndexOf(' ')))) 
      .ToArray(); 
} 

auf Ihrem Anwendungsfall abhängig, können Sie networkLocationRootPath zur Validierung jeden vermeiden cmd Injektionsprobleme.

0

Dies scheint ein fehlender Teil von .net nach codeproject.com zu sein. Die Website beschreibt dennoch eine solution, die im Jahr 2003 arbeitete.

Können Sie es versuchen und erklären, ob es funktioniert?

+0

Das will das OP nicht. Dies ist zum Auflisten von Ordnern, die von Ihrem Computer freigegeben sind. Das OP (und ich) möchten freigegebene Ordner von einem anderen Computer im Netzwerk auflisten. –

+1

Ich bin wirklich froh, einen Kommentar zu einer Antwort von ~ 3J her zu bekommen :) – kamaradclimber

+0

Ich habe dies nachgeschlagen und das war eine der Fragen, die kamen. Ich habe jetzt die Lösung hinzugefügt, die ich als Antwort gefunden habe. –

2

Ich weiß, dass dieser Thread alt ist, aber diese Lösung könnte schließlich jemandem helfen. Ich benutzte eine Befehlszeile und gab dann eine Teilzeichenfolge aus der Ausgabe zurück, die die Verzeichnisnamen enthielt.

static void Main(string[] args) 
    { 
     string servername = "my_test_server"; 
     List<string> dirlist = getDirectories(servername); 
     foreach (var dir in dirlist) 
     { 
      Console.WriteLine(dir.ToString()); 
     }  
     Console.ReadLine(); 
    } 

    public static List<string> getDirectories (string servername) 
    { 
     Process cmd = new Process(); 
     cmd.StartInfo.FileName = "cmd.exe"; 
     cmd.StartInfo.RedirectStandardInput = true; 
     cmd.StartInfo.RedirectStandardOutput = true; 
     cmd.StartInfo.CreateNoWindow = true; 
     cmd.StartInfo.UseShellExecute = false; 
     cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     cmd.Start(); 
     cmd.StandardInput.WriteLine("net view \\\\" + servername); 
     cmd.StandardInput.Flush(); 
     cmd.StandardInput.Close(); 
     string output = cmd.StandardOutput.ReadToEnd(); 
     cmd.WaitForExit(); 
     cmd.Close(); 
     List<string> dirlist = new List<string>(); 
     if(output.Contains("Disk")) 
     { 
      int firstindex = output.LastIndexOf("-") + 1; 
      int lastindex = output.LastIndexOf("Disk"); 
      string substring = ((output.Substring(firstindex, lastindex - firstindex)).Replace("Disk", string.Empty).Trim()); 
      dirlist = substring.Split('\n').ToList(); 
     } 
     return dirlist; 
    }