0

我编写了一个使用 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 放弃按字母排序的共享对象。我无法想象任何方法如何并行化这个过程。有任何想法吗?

4

1 回答 1

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]);
 }

}

于 2013-08-16T08:08:32.227 回答