Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取本地网络服务器上所有UNC共享文件夹的列表_C#_.net - Fatal编程技术网

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

C# 获取本地网络服务器上所有UNC共享文件夹的列表,c#,.net,C#,.net,我正在尝试获取本地intranet服务器上可用的所有共享文件夹的列表 System.IO.Directory.GetDirectories()适用于\\myServer\myShare这样的路径,但是对于\\myServer这样的路径,我遇到了一个异常: 未处理的异常:System.ArgumentException:UNC路径的格式应为\server\share 有没有办法获取服务器所有共享文件夹的列表?最后,我正在寻找一种方法,可以根据给定的路径处理这两种情况—返回给定服务器的所有共享列表,

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

System.IO.Directory.GetDirectories()
适用于
\\myServer\myShare
这样的路径,但是对于
\\myServer
这样的路径,我遇到了一个异常:

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


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

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


需要适当的权限。

我想这就是您正在寻找的@kbrimington的可能副本,这个Q要求远程,而这个Q只要求本地。@Richard:接受的答案也包括远程。@kbrimington-出于某种原因,我通过
NetShareEnum
只是本地的。。。我喜欢它的可重构性,需要注意的是,它被认为是解决这个问题的答案(特别是这里的WMI答案避免了P/Invoke的需要。@Richard:接受答案中的CodeProject链接提供了“枚举本地和远程机器上的网络共享,并将本地文件路径转换为UNC路径的类”。(重点已添加)。来自@ajay_whiz的答案引用了同一篇文章。谢谢,这对我来说很有效。我最终编写了一个扩展System.IO.Directory.GetDirectory()的方法。它使用正则表达式来确定给定的路径类型(//server/share或just//server),然后调用Directory.GetDirectories()或者分别使用CodeProject库。谢谢,Bradley。您的技术在枚举本地计算机上的共享时效果很好,但是当我尝试访问本地网络上的服务器时,它给了我
System.Management.ManagementException:Access denied
异常。同时,另一个解决方案(使用P/Invoke)在同一台服务器上工作得很好。是的,我检查过了,你说得对。我认为WMI的作用远远超出了人们的想象——包括需要以某种方式使用ConnectionOptions和ManagementScope类来访问远程计算机。我确信这是可能的,但在这个阶段,我没有经验来描述如何使用WMI做吧。对我来说就像一个符咒(打了一个移动机器)。但是,我是以我自己的身份运行的,并且我的用户在目标计算机上拥有管理员权限。这可能会非常出色,但我得到错误
System.Runtime.InteropServices.COMException:“RPC服务器不可用。
看起来它与我无法控制的Windows防火墙设置有关。
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;
    }