2010-08-25 8 views
16

J'essaie d'obtenir une liste de tous les dossiers partagés disponibles sur un serveur intranet local.Obtenez une liste de tous les dossiers partagés UNC sur un serveur de réseau local

Le System.IO.Directory.GetDirectories() fonctionne très bien pour un chemin comme \\myServer\myShare, mais je reçois une exception pour un chemin comme \\myServer:

Exception non gérée: System.ArgumentException: Le chemin UNC doit être de la forme \ serveur \partager.

Y at-il un moyen d'obtenir une liste tous les dossiers partagés pour un serveur? Finalement, je suis à la recherche d'une méthode capable de gérer les deux scénarios en fonction d'un chemin donné: renvoyer une liste de tous les partages pour un serveur donné et retourner une liste de tous les sous-répertoires pour un dossier partagé réseau donné.

+2

double possible de [Énumération des partages réseau avec C#] (http://stackoverflow.com/questions/2091126/enumerating-network-shares-with -c) – kbrimington

+0

@kbrimington ce Q demande à distance, que Q demande juste local. – Richard

+1

@Richard: La réponse acceptée couvre également la télécommande. – kbrimington

Répondre

3

Je pense que c'est ce que vous cherchez http://www.codeproject.com/KB/IP/networkshares.aspx

+2

Merci, cela a fonctionné pour moi. J'ai fini par écrire une méthode qui étend System.IO.Directory.GetDirectories().Il utilise des expressions régulières pour déterminer quel type de chemin est donné (// serveur/partage ou simplement // serveur) puis appelle soit Directory.GetDirectories() soit la bibliothèque CodeProject respectivement. –

5

est ici une technique qui utilise System.Management (ajouter une référence à cette assemblée):

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

autorisations appropriées sont nécessaires.

+1

Merci, Bradley. Votre technique a bien fonctionné pour l'énumération des partages sur ma machine locale, mais elle m'a donné l'exception 'System.Management.ManagementException: Access denied' lorsque j'ai essayé d'accéder au serveur sur un réseau local. Dans le même temps l'autre solution (utilise P/Invoke) a bien fonctionné pour le même serveur. –

+0

Oui, je l'ai vérifié et vous avez raison. Je pense qu'il y a plus que WMI à la portée de l'œil - y compris la nécessité de travailler avec les classes ConnectionOptions et ManagementScope d'une certaine manière afin d'accéder aux ordinateurs distants. Je suis sûr que c'est possible, mais à ce stade je n'ai pas l'expérience pour décrire comment le faire. –

+0

A travaillé comme un charme pour moi (frapper une machine à enlever). Je courais comme moi, cependant, et mon utilisateur a des droits d'administrateur sur la machine cible. –

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; 
    } 
Questions connexes