You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows中列出本地、映射驱动器及UNC网络共享路径?

Windows下枚举本地、映射驱动器及UNC网络共享的解决方案

要同时获取本地/映射盘符和UNC路径形式的网络共享,需要结合GetLogicalDrives/GetDriveType处理盘符,再通过WNetOpenEnum和WNetEnumResource枚举网络中的共享资源。你之前尝试的WNet系列API是正确方向,问题大概率出在枚举参数或层级处理上。

实现步骤

  1. 用你原有的代码枚举本地和映射盘符
  2. 通过WNet系列API枚举网络中的磁盘类共享资源,包括服务器下的多个共享(如\\server\share1、\\server\share2)

完整代码示例

#include <windows.h>
#include <iostream>
#include <vector>

// 递归枚举网络资源
void EnumNetworkResources(LPNETRESOURCE lpNetResource) {
    DWORD dwResult, dwEntries = -1, dwBufferSize = 16384;
    std::vector<char> buffer(dwBufferSize);
    LPNETRESOURCE lpEnumResource = reinterpret_cast<LPNETRESOURCE>(buffer.data());

    // 打开枚举会话
    HANDLE hEnum;
    dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, lpNetResource, &hEnum);
    if (dwResult != NO_ERROR) {
        return;
    }

    // 枚举资源
    do {
        dwResult = WNetEnumResource(hEnum, &dwEntries, lpEnumResource, &dwBufferSize);
        if (dwResult == NO_ERROR || dwResult == ERROR_MORE_DATA) {
            for (DWORD i = 0; i < dwEntries; ++i) {
                // 打印共享路径
                if (lpEnumResource[i].dwDisplayType == RESOURCEDISPLAYTYPE_SHARE && 
                    lpEnumResource[i].lpRemoteName != nullptr) {
                    std::cout << "UNC Share: " << lpEnumResource[i].lpRemoteName << '\n';
                }
                // 如果是容器(比如服务器),递归枚举其子资源
                if (lpEnumResource[i].dwUsage & RESOURCEUSAGE_CONTAINER) {
                    EnumNetworkResources(&lpEnumResource[i]);
                }
            }
        }
    } while (dwResult == ERROR_MORE_DATA);

    WNetCloseEnum(hEnum);
}

int main() {
    // 枚举本地和映射盘符
    DWORD drives = GetLogicalDrives();
    DWORD mask = 1;
    std::cout << "=== Local/Mapped Drives ===\n";
    for (UINT i = 0; i < 32; i++) {
        if (mask & drives) {
            CHAR driveName[] = {(CHAR)('A' + i), ':', '\\', 0};
            UINT driveType = GetDriveTypeA(driveName);
            std::cout << "Drive " << driveName << " is " << 
                (driveType == DRIVE_REMOTE ? "remote (mapped)" : "local") << '\n';
        }
        mask <<= 1;
    }

    // 枚举UNC网络共享
    std::cout << "\n=== UNC Network Shares ===\n";
    NETRESOURCE netResource = {0};
    netResource.dwScope = RESOURCE_GLOBALNET;
    netResource.dwType = RESOURCETYPE_DISK;
    netResource.dwDisplayType = RESOURCEDISPLAYTYPE_SERVER;
    netResource.dwUsage = RESOURCEUSAGE_CONTAINER;
    EnumNetworkResources(&netResource);

    return 0;
}

关键说明

  • WNetOpenEnum参数:指定RESOURCE_GLOBALNET枚举整个网络,RESOURCETYPE_DISK仅枚举磁盘类资源,过滤掉打印机等其他类型。
  • 递归枚举:网络资源是层级结构,服务器是容器资源,需要递归枚举才能获取其下的所有共享目录。
  • 错误处理:WNetEnumResource返回ERROR_MORE_DATA时,说明缓冲区不够,示例中用足够大的缓冲区简化处理,实际场景可动态调整缓冲区大小。
  • 资源类型判断:通过RESOURCEDISPLAYTYPE_SHARE筛选出实际的共享路径,避免枚举服务器本身。

编译时需要链接mpr.lib(Windows网络多提供者路由库),比如在MSVC中添加/link mpr.lib参数。

内容的提问来源于stack exchange,提问作者Jackson Brienen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:32:40