映射的网络驱动器无法在C#中列出

我试图列出我的应用程序中的所有本地驱动器, DriveInfo.GetDrives返回本地驱动器号,我也需要映射驱动器。

目前我有:C:,D:和G:(HDD),E:和F:(CD),以及S:和Z :(映射网络驱动器)。 (是的,它们在Windows资源管理器和Total Commander中都可见。)但是只能以编程方式检索C,D,E,F,G。

我还尝试了Environment.GetLogicalDrives()GetLogicalDriveStrings (pInvoke)FindFirstVolumeFindNextVolumen (pInvoke)。 我试图在注册表中找到映射的驱动器列表。 没有任何作用,只有HDD和CD字母被检索。

没有任何exception,直接WinAPI调用中没有指示错误,现在我被卡住了。 这是某种安全设置吗? 在我看的每个地方,人们都说DriveInfo.GetDrives应该回放映射的驱动器。 这是真的吗?

我正在使用Vista Home Pro。 应用程序从本地计算机运行,它也在Visual Studio 2008中构建。

我发布了我使用的内容,但它很简单,我不能做错的事情:

 foreach (System.IO.DriveInfo di in System.IO.DriveInfo.GetDrives()) Console.WriteLine(di.Name); 

结果:C:\ D:\ E:\ F:\ G:\按任意键继续。 。 。

我怎样才能使它工作?

好的,我发现了如何在Vista上获得断开连接的驱动器。 不容易,但它是可行的:

首先,您需要以下WinAPI函数的pInvoke定义:

  • WNetOpenEnum
  • WNetEnumResource
  • WNetCloseEnum

那些需要一个结构和一些枚举。

然后你需要多次调用它们,最后,你得到列表。 这是代码,要注意,它很长:

  [DllImport("MPR.dll", CharSet = CharSet.Auto)] static extern int WNetEnumResource(IntPtr hEnum, ref int lpcCount, IntPtr lpBuffer, ref int lpBufferSize); [DllImport("MPR.dll", CharSet = CharSet.Auto)] static extern int WNetOpenEnum(RESOURCE_SCOPE dwScope, RESOURCE_TYPE dwType, RESOURCE_USAGE dwUsage, [MarshalAs(UnmanagedType.AsAny)][In] object lpNetResource, out IntPtr lphEnum); [DllImport("MPR.dll", CharSet = CharSet.Auto)] static extern int WNetCloseEnum(IntPtr hEnum); public enum RESOURCE_SCOPE : uint { RESOURCE_CONNECTED = 0x00000001, RESOURCE_GLOBALNET = 0x00000002, RESOURCE_REMEMBERED = 0x00000003, RESOURCE_RECENT = 0x00000004, RESOURCE_CONTEXT = 0x00000005 } public enum RESOURCE_TYPE : uint { RESOURCETYPE_ANY = 0x00000000, RESOURCETYPE_DISK = 0x00000001, RESOURCETYPE_PRINT = 0x00000002, RESOURCETYPE_RESERVED = 0x00000008, } public enum RESOURCE_USAGE : uint { 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 : uint { 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 } [StructLayout(LayoutKind.Sequential)] public struct NetResource { public RESOURCE_SCOPE dwScope; public RESOURCE_TYPE dwType; public RESOURCE_DISPLAYTYPE dwDisplayType; public RESOURCE_USAGE 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; } static System.Collections.Generic.Dictionary WNetResource(object resource) { System.Collections.Generic.Dictionary result = new System.Collections.Generic.Dictionary(); int iRet; IntPtr ptrHandle = new IntPtr(); try { iRet = WNetOpenEnum( RESOURCE_SCOPE.RESOURCE_REMEMBERED, RESOURCE_TYPE.RESOURCETYPE_DISK, RESOURCE_USAGE.RESOURCEUSAGE_ALL, resource, out ptrHandle); if (iRet != 0) return null; int entries = -1; int buffer = 16384; IntPtr ptrBuffer = Marshal.AllocHGlobal(buffer); NetResource nr; iRet = WNetEnumResource(ptrHandle, ref entries, ptrBuffer, ref buffer); while ((iRet == 0) || (entries > 0)) { Int32 ptr = ptrBuffer.ToInt32(); for (int i = 0; i < entries; i++) { nr = (NetResource)Marshal.PtrToStructure(new IntPtr(ptr), typeof(NetResource)); if (RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER == (nr.dwUsage & RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER)) { //call recursively to get all entries in a container WNetResource(nr); } ptr += Marshal.SizeOf(nr); result.Add(nr.lpLocalName, nr); } entries = -1; buffer = 16384; iRet = WNetEnumResource(ptrHandle, ref entries, ptrBuffer, ref buffer); } Marshal.FreeHGlobal(ptrBuffer); iRet = WNetCloseEnum(ptrHandle); } catch (Exception) { } return result; } public static System.Collections.Generic.Dictionary WNetResource() { return WNetResource(null); } 

你必须调用WNetResource(),然后你将获得驱动器列表。 (和蛋糕:-))

Environment.GetLogicalDrives()DriveInfo.GetDrives()都返回了我所有的网络驱动器。

您的应用程序是否以不同的用户身份运行(例如asp.net网站)? 如果是,是否实际为该用户映射了驱动器? 您可能会发现驱动器已为您映射,但它们实际上并未针对您的应用程序运行的用户进行映射。