【问题标题】:WNetEnumResource returns incomplete resultsWNetEnumResource 返回不完整的结果
【发布时间】:2013-08-06 08:52:09
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    要枚举所有网络资源,应用程序可以通过调用 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]);
     }
    

    }

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多