如何在Windows中列出本地、映射驱动器及UNC网络共享路径?
Windows下枚举本地、映射驱动器及UNC网络共享的解决方案
要同时获取本地/映射盘符和UNC路径形式的网络共享,需要结合GetLogicalDrives/GetDriveType处理盘符,再通过WNetOpenEnum和WNetEnumResource枚举网络中的共享资源。你之前尝试的WNet系列API是正确方向,问题大概率出在枚举参数或层级处理上。
实现步骤
- 用你原有的代码枚举本地和映射盘符
- 通过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
相关产品推荐
相关产品推荐

