获取本地网络服务器上所有UNC共享文件夹的列表

我正在尝试获取本地Intranet服务器上可用的所有共享文件夹的列表。

System.IO.Directory.GetDirectories()适用于像\\myServer\myShare这样的路径,但是我得到了像\\myServer这样的路径的exception:

未处理的exception:System.ArgumentException:UNC路径的格式应为\ server \ share。

有没有办法获取服务器的所有共享文件夹的列表? 最终,我正在寻找一种方法,可以根据给定的路径处理这两种情况 – 返回给定服务器的所有共享列表,并返回给定网络共享文件夹的所有子目录列表。

我认为这就是你要找的http://www.codeproject.com/KB/IP/networkshares.aspx

这是一种使用System.Management的技术(添加对此程序集的引用):

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

需要适当的权限。

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