C# 映射的网络驱动器不能在C中列出#

C# 映射的网络驱动器不能在C中列出#,c#,mapped-drive,driveinfo,C#,Mapped Drive,Driveinfo,我正在尝试列出应用程序中的所有本地驱动器,并且DriveInfo.GetDrives返回本地驱动器号,我还需要映射的驱动器 目前我有:C:,D:,和G:(硬盘),E:和F:(光盘),以及S:和Z:(映射网络驱动器)。(是的,它们都可以在Windows资源管理器中看到,也可以在中看到。) 但只有C、D、E、F、G是通过编程方式检索的 我还尝试了Environment.GetLogicalDrives(),GetLogicalDriveStrings(pInvoke),FindFirstVolume

我正在尝试列出应用程序中的所有本地驱动器,并且
DriveInfo.GetDrives
返回本地驱动器号,我还需要映射的驱动器

目前我有:C:,D:,和G:(硬盘),E:和F:(光盘),以及S:和Z:(映射网络驱动器)。(是的,它们都可以在Windows资源管理器中看到,也可以在中看到。) 但只有C、D、E、F、G是通过编程方式检索的

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

没有出现任何异常,直接WinAPI调用中没有指示错误,现在我被卡住了。这是某种安全设置吗?无论我到哪里,人们都说
DriveInfo.GetDrives
应该返回映射的驱动器。这是真的吗

我正在使用Vista Home Pro。该应用程序是从本地计算机运行的,它也是在这里使用VisualStudio2008构建的

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

foreach (System.IO.DriveInfo di in System.IO.DriveInfo.GetDrives())
    Console.WriteLine(di.Name);
结果: C:\ D:\ E:\ F:\ G:\ 按任意键继续


如何使其工作?

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


您的应用程序是否作为其他用户运行(例如asp.net网站)?如果是,是否为该用户映射了驱动器?您可能会发现这些驱动器是为您映射的,但实际上它们并不是为您的应用程序所运行的用户映射的。

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

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

  • 黄体酮
  • 自然资源
  • 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<string, NetResource> WNetResource(object resource)
    {
        System.Collections.Generic.Dictionary<string, NetResource> result = new System.Collections.Generic.Dictionary<string, NetResource>();

        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<string, NetResource> WNetResource()
    {
        return WNetResource(null);
    }
[DllImport(“MPR.dll”,CharSet=CharSet.Auto)]
静态外部内部所有者资源(IntPtr hEnum、ref int lpcCount、IntPtr lpBuffer、ref int lpBufferSize);
[DllImport(“MPR.dll”,CharSet=CharSet.Auto)]
静态extern int wnetopeneum(资源范围dwScope、资源类型dwType、资源使用dwUsage、,
[Marshallas(UnmanagedType.AsAny)][In]对象lpNetResource,out IntPtr lphEnum);
[DllImport(“MPR.dll”,CharSet=CharSet.Auto)]
静态外部int WNTCLOSENUM(IntPtr hEnum);
公共枚举资源\u作用域:uint
{
资源\u已连接=0x00000001,
资源\u GLOBALNET=0x00000002,
资源=0x00000003,
资源\u最近=0x00000004,
资源上下文=0x00000005
}
公共枚举资源类型:uint
{
RESOURCETYPE_ANY=0x00000000,
RESOURCETYPE_DISK=0x00000001,
RESOURCETYPE_PRINT=0x00000002,
RESOURCETYPE_RESERVED=0x00000008,
}
公共枚举资源\u用法:uint
{
RESOURCEUSAGE_CONNECTABLE=0x00000001,
RESOURCEUSAGE\u容器=0x00000002,
RESOURCEUSAGE\u NOLOCALDEVICE=0x00000004,
RESOURCEUSAGE\u同级=0x00000008,
RESOURCEUSAGE_ATTACHED=0x00000010,
RESOURCEUSAGE_ALL=(RESOURCEUSAGE_可连接| RESOURCEUSAGE_容器| RESOURCEUSAGE_已连接),
}
公共枚举资源\u显示类型:uint
{
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
}
[StructLayout(LayoutKind.Sequential)]
公共结构网络资源
{
公共资源范围;
公共资源类型;
公共资源_DISPLAYTYPE dwDisplayType;
公共资源使用情况;
[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)]
公共字符串提供者;
}
静态System.Collections.Generic.Dictionary WNetResource(对象资源)
{
System.Collections.Generic.Dictionary结果=新建System.Collections.Generic.Dictionary();
国际互联网;
IntPtr ptrHandle=新的IntPtr();
尝试
{
iRet=WNetOpenEnum(
RESOURCE\u SCOPE.RESOURCE\u membered,RESOURCE\u TYPE.RESOURCETYPE\u DISK,RESOURCE\u USAGE.RESOURCE USAGE\u ALL,
资源,输出ptrHandle);
如果(iRet!=0)
返回null;
int条目=-1;
int缓冲区=16384;
IntPtr ptrBuffer=Marshal.AllocHGlobal(缓冲区);
网络资源;
iRet=WNetEnumResource(ptrHandle、ref条目、ptrBuffer、ref缓冲区);
而((iRet==0)| |(条目>0))
{
Int32 ptr=ptrBuffer.ToInt32();
for(int i=0;i