C# 获取共享计算机.NET上的目录列表

C# 获取共享计算机.NET上的目录列表,c#,.net,networking,C#,.net,Networking,我有一个“\\computer”格式的共享计算机名称列表,需要在这些计算机上查找共享文件夹 我能找到的所有.Net方法都需要调用有效的UNC,但由于我只有计算机列表,因此无法生成有效的UNC 是否有办法仅使用计算机名称(如“\\computer”)来查找计算机上的所有共享文件夹?在标准BCL中没有办法这样做。为此,您需要访问本机函数NetShareEnum 不过,这是一点工作。幸运的是,CodeProject上的某个人已经完成了这项工作,并输出了一个库,将其封装到一个漂亮的托管API中 Co

我有一个“\\computer”格式的共享计算机名称列表,需要在这些计算机上查找共享文件夹

我能找到的所有.Net方法都需要调用有效的UNC,但由于我只有计算机列表,因此无法生成有效的UNC


是否有办法仅使用计算机名称(如“\\computer”)来查找计算机上的所有共享文件夹?

在标准BCL中没有办法这样做。为此,您需要访问本机函数NetShareEnum

不过,这是一点工作。幸运的是,CodeProject上的某个人已经完成了这项工作,并输出了一个库,将其封装到一个漂亮的托管API中


CodeProject有一篇文章包含WMI类的包装器:

包装器是用VB.NET编写的,但当然可以将其构建到DLL中并从C#调用

[所以诺多林,你是对的。]

试试这个代码

在Windows XP、Windows Vista中测试

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication
{

  class Program
  {

        public enum RESOURCE_SCOPE_NET
        {
        RESOURCE_CONNECTED  = 0x00000001,
        RESOURCE_GLOBALNET  = 0x00000002,
        RESOURCE_REMEMBERED = 0x00000003,
        RESOURCE_RECENT     = 0x00000004,
        RESOURCE_CONTEXT    = 0x00000005
        }

        public enum RESOURCE_TYPE_NET
        {
        RESOURCETYPE_ANY      = 0x00000000,
        RESOURCETYPE_DISK     = 0x00000001,
        RESOURCETYPE_PRINT    = 0x00000002,
        RESOURCETYPE_RESERVED = 0x00000008,
        }

        public enum RESOURCE_USAGE_NET
        {
        RESOURCEUSAGE_CONNECTABLE   =0x00000001,
        RESOURCEUSAGE_CONTAINER     =0x00000002,
        RESOURCEUSAGE_NOLOCALDEVICE =0x00000004,
        RESOURCEUSAGE_SIBLING       =0x00000008,
        RESOURCEUSAGE_ATTACHED      =0x00000010,
        RESOURCEUSAGE_ALL           =(RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
        }

        public enum RESOURCE_DISPLAYTYPE_NET
        {
          RESOURCEDISPLAYTYPE_GENERIC = 0x00000000,
          RESOURCEDISPLAYTYPE_DOMAIN  = 0x00000001,
          RESOURCEDISPLAYTYPE_SERVER  = 0x00000002,
          RESOURCEDISPLAYTYPE_SHARE   = 0x00000003,
          RESOURCEDISPLAYTYPE_FILE    = 0x00000004,
          RESOURCEDISPLAYTYPE_GROUP   = 0x00000005,
          RESOURCEDISPLAYTYPE_NETWORK = 0x00000006,
          RESOURCEDISPLAYTYPE_ROOT    = 0x00000007,
          RESOURCEDISPLAYTYPE_SHAREADMIN   = 0x00000008,
          RESOURCEDISPLAYTYPE_DIRECTORY    = 0x00000009,
          RESOURCEDISPLAYTYPE_TREE         = 0x0000000A,
          RESOURCEDISPLAYTYPE_NDSCONTAINER = 0x0000000B
        }     

        [DllImport("mpr.dll", CharSet=CharSet.Auto)]
        public static extern int WNetEnumResource(
        IntPtr   hEnum,
        ref int  lpcCount,
        IntPtr   lpBuffer,
        ref int  lpBufferSize );

        [DllImport("mpr.dll", CharSet=CharSet.Auto)]
        public static extern int WNetOpenEnum( RESOURCE_SCOPE_NET dwScope, RESOURCE_TYPE_NET dwType,  RESOURCE_USAGE_NET dwUsage,  [MarshalAs(UnmanagedType.AsAny)][In] Object lpNetResource,  out IntPtr lphEnum);
        [DllImport("mpr.dll", CharSet=CharSet.Auto)]
        public static extern int WNetCloseEnum( IntPtr hEnum );



        public struct NETRESOURCE
        {
          public RESOURCE_SCOPE_NET dwScope;
          public RESOURCE_TYPE_NET dwType;
          public RESOURCE_DISPLAYTYPE_NET dwDisplayType;
          public RESOURCE_USAGE_NET dwUsage;
          [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
          public string lpLocalName;
          [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
          public string lpRemoteName;
          [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
          public string lpComment;
          [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
          public string lpProvider;

        }


        private static void InitScan(Object Dummy)

        {
        int iRet;
        IntPtr ptrHandle = new IntPtr();
        try

        {
          iRet = WNetOpenEnum(RESOURCE_SCOPE_NET.RESOURCE_GLOBALNET, RESOURCE_TYPE_NET.RESOURCETYPE_ANY, RESOURCE_USAGE_NET.RESOURCEUSAGE_ALL, Dummy, out ptrHandle);

        if( iRet != 0 )
        {
        return;
        }

        int entries;
        int buffer = 16384;
        IntPtr ptrBuffer = Marshal.AllocHGlobal( buffer );
        NETRESOURCE nr;

        for(;;)
        {
        entries = -1;
        buffer = 16384;
        iRet =WNetEnumResource( ptrHandle, ref entries, ptrBuffer, ref buffer );

        if( (iRet != 0) || (entries < 1) )
        {
        break;
        }

        Int32 ptr = ptrBuffer.ToInt32();
        for( int i = 0; i < entries; i++ )
        {
        nr = (NETRESOURCE)Marshal.PtrToStructure( new IntPtr(ptr), typeof(NETRESOURCE) );
        if(RESOURCE_USAGE_NET.RESOURCEUSAGE_CONTAINER == (nr.dwUsage & RESOURCE_USAGE_NET.RESOURCEUSAGE_CONTAINER))

        {
          InitScan(nr);
        }

        ptr += Marshal.SizeOf( nr );
        Console.WriteLine(" {0} : LocalName='{1}' RemoteName='{2}' Description='{3}' Provider='{4}'", nr.dwDisplayType.ToString(), nr.lpLocalName, nr.lpRemoteName,nr.lpComment,nr.lpProvider );
        }

        }

        Marshal.FreeHGlobal( ptrBuffer );
        iRet =WNetCloseEnum( ptrHandle );
        }

        catch(Exception e)

        {
          Console.WriteLine("Error ** "+e.Message+" ** Trace "+e.StackTrace);
        }

        }


    static void Main(string[] args)
    {
      Console.WriteLine("Scannig Network....Wait a moment , be patient please ;)");
      InitScan(null);
      Console.WriteLine("Scan Network Finished");
      Console.Read();
    }
  }
}
使用系统;
使用System.Runtime.InteropServices;
命名空间控制台应用程序
{
班级计划
{
公共枚举资源\u范围\u网络
{
资源\u已连接=0x00000001,
资源\u GLOBALNET=0x00000002,
资源=0x00000003,
资源\u最近=0x00000004,
资源上下文=0x00000005
}
公共枚举资源类型网络
{
RESOURCETYPE_ANY=0x00000000,
RESOURCETYPE_DISK=0x00000001,
RESOURCETYPE_PRINT=0x00000002,
RESOURCETYPE_RESERVED=0x00000008,
}
公共枚举资源\u使用情况\u网络
{
RESOURCEUSAGE_CONNECTABLE=0x00000001,
RESOURCEUSAGE\u容器=0x00000002,
RESOURCEUSAGE\u NOLOCALDEVICE=0x00000004,
RESOURCEUSAGE\u同级=0x00000008,
RESOURCEUSAGE_ATTACHED=0x00000010,
RESOURCEUSAGE_ALL=(RESOURCEUSAGE_可连接| RESOURCEUSAGE_容器| RESOURCEUSAGE_已连接),
}
公共枚举资源\u显示类型\u网络
{
RESOURCEDISPLAYTYPE_GENERIC=0x00000000,
RESOURCEDISPLAYTYPE_域=0x00000001,
RESOURCEDISPLAYTYPE_服务器=0x00000002,
RESOURCEDISPLAYTYPE_SHARE=0x00000003,
RESOURCEDISPLAYTYPE_文件=0x00000004,
RESOURCEDISPLAYTYPE_组=0x00000005,
RESOURCEDISPLAYTYPE_网络=0x00000006,
RESOURCEDISPLAYTYPE_ROOT=0x00000007,
RESOURCEDISPLAYTYPE_SHAREADMIN=0x00000008,
RESOURCEDISPLAYTYPE_目录=0x00000009,
RESOURCEDISPLAYTYPE_TREE=0x0000000A,
RESOURCEDISPLAYTYPE\u NDSCONTAINER=0x0000000B
}     
[DllImport(“mpr.dll”,CharSet=CharSet.Auto)]
公共静态外部intowneumResource(
IntPtr hEnum,
参考int lpcCount,
IntPtr lpBuffer,
ref int lpBufferSize);
[DllImport(“mpr.dll”,CharSet=CharSet.Auto)]
public static extern int WNetOpenEnum(资源\u SCOPE\u NET dwScope,资源\u TYPE\u NET dwType,资源\u用法\u NET dwuse,[MarshalAs(UnmanagedType.AsAny)][In]对象lpNetResource,out IntPtr lphEnum);
[DllImport(“mpr.dll”,CharSet=CharSet.Auto)]
公共静态外部int WNTCLOSENUM(IntPtr hEnum);
公共结构网络资源
{
公共资源范围网络范围;
公共资源类型网络类型;
公共资源\u显示类型\u网络显示类型;
公共资源的使用情况;
[Marshallas(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
公共字符串lpLocalName;
[Marshallas(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
公共字符串名称;
[Marshallas(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
公共评论;
[Marshallas(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
公共字符串提供者;
}
私有静态void InitScan(对象虚拟)
{
国际互联网;
IntPtr ptrHandle=新的IntPtr();
尝试
{
iRet=WNetOpenEnum(资源\u范围\u网络.RESOURCE\u全局网络,资源\u类型\u网络.RESOURCETYPE\u任意,资源\u使用情况\u网络.resourceTusage\u全部,虚拟,out ptrHandle);
如果(iRet!=0)
{
返回;
}
整数分录;
int缓冲区=16384;
IntPtr ptrBuffer=Marshal.AllocHGlobal(缓冲区);
网络资源;
对于(;;)
{
条目=-1;
缓冲区=16384;
iRet=WNetEnumResource(ptrHandle、ref条目、ptrBuffer、ref缓冲区);
如果((iRet!=0)| |(条目<1))
{
打破
}
Int32 ptr=ptrBuffer.ToInt32();
for(int i=0;i

再见。

我的直觉告诉我有一种WMI方法,尽管这并不是说它一定比胜利更好