WNetEnumResource返回不完整的结果
问题描述:
我编写一个程序,使用WNet函数列出Windows网络共享对象。我注意到,由于某种原因,WNetEnumResource函数只检索我的本地共享,尽管资源管理器看到了更多的对象。这可能是什么原因造成的? 这里的代码:WNetEnumResource返回不完整的结果
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER, lpnr, &hEnum);
................
dwResultEnum = WNetEnumResource(hEnum, &cEntries, lpnrLocal, &cbBuffer);
这就是我的了:
Microsoft Terminal Services network
Microsoft Windows Network network
WORKGROUP domain
\\MOSKKM server
\\MOSKKM\HP LaserJet 3055 PCL5 share
\\MOSKKM\share share
\\MOSKKM\soft share
\\MOSKKM\tunnel share
Web Client Network network
我的系统是Win7的,我使用管理员帐户,并没有反病毒软件或防火墙上运行。并且在同一台机器上托管的桥接VirtualBox VM上也能正常工作(但是,很长一段时间)。什么可能是错的?也许还有其他一些方法来解决这个问题,而不是使用WNet功能?
还有:WNetEnumResource放弃按字母排序的共享对象。我无法想象任何方法如何并行化这个过程。有任何想法吗?
答
我想你需要编写递归函数来枚举网络资源,
枚举所有的网络资源,应用程序可以通过调用WNetOpenEnum设置为NULL的lpNetResource参数开始枚举,然后用返回的句柄调用WNetEnumResource来枚举资源。如果由WNetEnumResource函数返回的NETRESOURCE数组中的资源之一是一个容器资源,则可以调用WNetOpenEnum打开资源以进一步枚举。 (MSDN: WNetOpenEnum)
int EnumNetRes(NETRESOURCE *lpNetRes)
{
DWORD dwResult;
DWORD dwCount = -1;
DWORD dwSize = sizeof(NETRESOURCE)*MAX_NET_RESOURCES;
HANDLE hEnum;
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER, lpNetRes, &hEnum);
if(dwResult != NO_ERROR)
{
cerr << "WNetOpenEnum failed, error: " << dwResult << endl;
//...
return 1;
}
NETRESOURCE NetResources[MAX_NET_RESOURCES]; // #define MAX_NET_RESOURCES 1024
dwResult = WNetEnumResource(hEnum, &dwCount, NetResource, dwSize);
if(dwResult != NO_ERROR)
{
//...
return 1;
}
for(int i=0; i<dwCount; i++){
//...
// retrieve of information about resource
//...
if(NetResources[i].dwUsage & RESOURCEUSAGE_CONTAINER)
EnumNetRes(&NetResources[i]);
}
}