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