2010-08-25 13 views
16

Sto cercando di ottenere un elenco di tutte le cartelle condivise disponibili su un server Intranet locale.Ottenere un elenco di tutte le cartelle condivise UNC su un server di rete locale

Il System.IO.Directory.GetDirectories() funziona bene per un percorso come \\myServer\myShare, però mi sto un'eccezione per un percorso come \\myServer:

Eccezione non gestita: System.ArgumentException: Il percorso UNC deve essere nella forma \ server \Condividere.

C'è un modo per ottenere un elenco di tutte le cartelle condivise per un server? In definitiva, sto cercando un metodo in grado di gestire entrambi gli scenari in base a un determinato percorso, restituendo un elenco di tutte le condivisioni per un determinato server e restituendo un elenco di tutte le sottodirectory per una determinata cartella condivisa di rete.

+2

possibile duplicato del [Condivisioni di rete enumerazione con C#] (http://stackoverflow.com/questions/2091126/enumerating-network-shares-with -c) – kbrimington

+0

@kbrimington questo Q chiede il telecomando, che Q chiede solo locale. – Richard

+1

@Richard: la risposta accettata copre anche il remoto. – kbrimington

risposta

3

Penso che questo è quello che stai cercando http://www.codeproject.com/KB/IP/networkshares.aspx

+2

Grazie, questo ha funzionato per me. Ho finito per scrivere un metodo che estende System.IO.Directory.GetDirectories().Utilizza le espressioni regolari per capire quale tipo di percorso viene fornito (// server/condivisione o solo // server) e quindi chiama Directory.GetDirectories() o la libreria CodeProject rispettivamente. –

5

Ecco una tecnica che utilizza System.Management (aggiungere un riferimento a questa assemblea): sono necessari

using (ManagementClass shares = new ManagementClass(@"\\NameOfTheRemoteComputer\root\cimv2", "Win32_Share", new ObjectGetOptions())) { 
    foreach (ManagementObject share in shares.GetInstances()) { 
     Console.WriteLine(share["Name"]); 
    } 
} 

autorizzazioni appropriate.

+1

Grazie, Bradley. La tua tecnica ha funzionato bene per l'enumerazione delle condivisioni sul mio computer locale, tuttavia mi ha dato l'eccezione 'System.Management.ManagementException: Access negata' quando ho provato ad accedere al server su una rete locale. Allo stesso tempo l'altra soluzione (utilizza P/Invoke) ha funzionato bene per lo stesso server. –

+0

Sì, ho controllato e hai ragione. Penso che ci sia di più in WMI di quanto sembri - inclusa la necessità di lavorare con le classi ConnectionOptions e ManagementScope in un certo modo per accedere ai computer remoti. Sono sicuro che sia possibile, ma in questa fase non ho l'esperienza per descrivere come farlo. –

+0

Ha funzionato come un incantesimo per me (colpire una macchina rimossa). Stavo correndo come me, tuttavia, e il mio utente ha diritti di amministratore sul computer di destinazione. –

2
private DataTable GetSharedFolderAccessRule() 
    { 
     DataTable DT = new DataTable(); 

     try 
     { 
      DT.Columns.Add("ShareName"); 
      DT.Columns.Add("Caption"); 
      DT.Columns.Add("Path"); 
      DT.Columns.Add("Domain"); 
      DT.Columns.Add("User"); 
      DT.Columns.Add("AccessMask"); 
      DT.Columns.Add("AceType"); 

      ManagementScope Scope = new ManagementScope(@"\\.\root\cimv2"); 
      Scope.Connect(); 
      ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_LogicalShareSecuritySetting"); 
      ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query); 
      ManagementObjectCollection QueryCollection = Searcher.Get(); 

      foreach (ManagementObject SharedFolder in QueryCollection) 
      { 
       { 
        String ShareName = (String) SharedFolder["Name"]; 
        String Caption = (String)SharedFolder["Caption"]; 
        String LocalPath = String.Empty; 
        ManagementObjectSearcher Win32Share = new ManagementObjectSearcher("SELECT Path FROM Win32_share WHERE Name = '" + ShareName + "'"); 
        foreach (ManagementObject ShareData in Win32Share.Get()) 
        { 
         LocalPath = (String) ShareData["Path"]; 
        } 

        ManagementBaseObject Method = SharedFolder.InvokeMethod("GetSecurityDescriptor", null, new InvokeMethodOptions()); 
        ManagementBaseObject Descriptor = (ManagementBaseObject)Method["Descriptor"]; 
        ManagementBaseObject[] DACL = (ManagementBaseObject[])Descriptor["DACL"]; 
        foreach (ManagementBaseObject ACE in DACL) 
        { 
         ManagementBaseObject Trustee = (ManagementBaseObject)ACE["Trustee"]; 

         // Full Access = 2032127, Modify = 1245631, Read Write = 118009, Read Only = 1179817 
         DataRow Row = DT.NewRow(); 
         Row["ShareName"] = ShareName; 
         Row["Caption"] = Caption; 
         Row["Path"]  = LocalPath; 
         Row["Domain"]  = (String) Trustee["Domain"]; 
         Row["User"]  = (String) Trustee["Name"]; 
         Row["AccessMask"] = (UInt32) ACE["AccessMask"]; 
         Row["AceType"] = (UInt32) ACE["AceType"]; 
         DT.Rows.Add(Row); 
         DT.AcceptChanges(); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.StackTrace, ex.Message); 
     } 

     return DT; 
    } 
Problemi correlati