2010-08-25 15 views
16

Próbuję uzyskać listę wszystkich udostępnionych folderów dostępnych na lokalnym serwerze intranetowym.Wyświetl listę wszystkich udostępnionych folderów UNC na serwerze sieci lokalnej.

System.IO.Directory.GetDirectories() działa dobrze na ścieżce jak \\myServer\myShare jednak dostaję wyjątek dla ścieżki jak \\myServer:

Unhandled Wyjątek: System.ArgumentException: Ścieżka UNC powinna być serwerem formą \ \dzielić.

Czy istnieje sposób na uzyskanie listy wszystkich folderów udostępnionych dla serwera? Ostatecznie szukam metody, która może obsłużyć oba scenariusze w oparciu o daną ścieżkę - zwracając listę wszystkich udziałów dla danego serwera i zwracając listę wszystkich podkatalogów dla danego udostępnionego folderu sieciowego.

+2

możliwym duplikatu [udziałów sieciowych wyliczanie z C#] (http://stackoverflow.com/questions/2091126/enumerating-network-shares-with -c) – kbrimington

+0

@kbrimington Q pyta o zdalny, że Q pyta tylko o lokalny. – Richard

+1

@Richard: Przyjęta odpowiedź obejmuje również zdalne. – kbrimington

Odpowiedz

3

myślę, że to jest to, czego szukasz http://www.codeproject.com/KB/IP/networkshares.aspx

+2

Dzięki, to działało dla mnie. W końcu napisałem metodę, która rozszerza System.IO.Directory.GetDirectories().Używa wyrażeń regularnych do określenia, jaki rodzaj ścieżki jest podany (// serwer/udział lub po prostu // serwer), a następnie wywołuje odpowiednio Directory.GetDirectories() lub bibliotekę CodeProject. –

5

Oto technika, która wykorzystuje System.Management (dodać odwołanie do tego zestawu) są wymagane

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

odpowiednie uprawnienia.

+1

Dzięki, Bradley. Twoja technika działała dobrze, wyliczając udziały na mojej maszynie lokalnej, ale dała mi wyjątek 'System.Management.ManagementException: Access denied', gdy próbowałem uzyskać dostęp do serwera w sieci lokalnej. W tym samym czasie inne rozwiązanie (używa P/Invoke) działało dobrze na tym samym serwerze. –

+0

Tak, sprawdziłem to i masz rację. Wydaje mi się, że WMI jest czymś więcej niż na pierwszy rzut oka - w tym koniecznością pracy z klasami ConnectionOptions i ManagementScope w określony sposób, aby uzyskać dostęp do komputerów zdalnych. Jestem pewien, że to możliwe, ale na tym etapie nie mam doświadczenia, aby opisać, jak to zrobić. –

+0

Pracowałam jak urok dla mnie (uderzając w maszynę do usuwania). Pracowałem jednak jako ja, a mój użytkownik ma prawa administratora na maszynie docelowej. –

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; 
    } 
Powiązane problemy