WNetEnumResource返回不完整的结果

时间:2013-08-06 08:52:10

标签: c++ winapi networking network-shares wnet

我正在使用WNet功能编写一个列出Windows网络共享对象的程序。我注意到,由于某些原因,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放弃按字母排序的共享对象。我无法想象如何并行化这个过程。任何想法?

1 个答案:

答案 0 :(得分:0)

我认为你需要编写递归函数来枚举网络资源,

  

要枚举所有网络资源,应用程序可以通过调用WNetOpenEnum并将lpNetResource参数设置为NULL来开始枚举,然后使用返回的句柄调用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]);
 }

}